存档

文章标签 ‘编译器’

编译器对switch case结构的优化

2012年5月17日 12 条评论

在使用IDA分析Crack Me的时候,发现IDA对switch case结构的分析很是清晰,还发现了一个jump table for switch statement,也就是所谓的跳转表了,是编译器优化的结果。对于case分支的值是连续的那种,所有分支的跳转地址都会存入一个数组之中,然后通过case的值来寻址,如果值超出边界则直接跳到default分支所在地址。

如果case分支的值之间有一定的间隔,但是差距又不是很大,则会先生成一个数组(可能比较大),先通过switch的变量当做下标在一个数组中取得对应的值,然后把这个值当做下标再在跳转地址表中取得对应的地址。

如果case分支的部分值之间有一定的间隔,而又有一些分支的值没有规律,比如很大,且分布不均匀等。那么分布均匀的那一部分将采用两级跳转表的形式,而其他分支则采用简单的比较判断方式。

如果case分支值没有规律,则会采用二叉树查找的方式进行优化。
[......]

又是C++空类

2011年5月6日 8 条评论

之前在博客也写过一些空类相关的文章,记得当时候还有一个问题没有想明白,于是在经过了一番思索。空类问题似乎也是面试中经常涉及的问题,还是先看题目吧:

// Author: 代码疯子
// Blog: http://www.programlife.net/
// C++空类以及sizeof问题
#include <iostream>
using namespace std;
 
class Empty
{
public:
char arr[0];
[......]

继续阅读

分类: C++编程 标签: , , ,

阻止编译器自动生成copy函数

2011年4月11日 没有评论

防止一个class被copy,而且将错误提前到链接阶段,可以将这个类的copy constructor和copy assignment操作符都声明为private而且不做定义。

class SomeClass
{
private:
SomeClass(const SomeClass&);
SomeClass& operator=(const SomeClass&);
public:
//…
private:
//..[......]

继续阅读

分类: C++编程 标签: , , ,