1

我有以下一段代码,

方案 1

/* get count of elements in an array */
#define COUNT(x)         sizeof(x)/sizeof(x[0])

struct Data data[] = {/* some data goes here */};

int count = COUNT(data);

方案 2

#define TOTAL            32
#define EACH              4
int count = (TOTAL/EACH)

我知道宏在预处理期间被解析,并且 sizeof 是编译时运算符,但是除法怎么样:它在编译期间得到优化吗?

是否有任何工具可以查看编译器所做的优化?

4

1 回答 1

4

通常你可以让编译器向你展示生成的汇编代码。使用 Visual C++,您可以使用该/Fa<file>选项来做到这一点。gcc-S选择权。

至于你的问题:大多数编译器应该预先计算常量表达式,至少在优化级别高于O0.

让我们看看您的示例场景:

#define COUNT(x)         sizeof(x)/sizeof(x[0])
int data[] = {1, 2, 3, 4, 5};
int count = COUNT(data);

cl /c /Fascenario1.asm scenario1.c用产量编译:

...
PUBLIC  _data
PUBLIC  _count
_DATA   SEGMENT
_data   DD  01H
    DD  02H
    DD  03H
    DD  04H
    DD  05H
_count  DD  05H
_DATA   ENDS
END

您会看到count接近末尾的值,它确实是 5。因此即使没有打开优化,编译器也会计算出该值。

你的第二种情况:

#define TOTAL            32
#define EACH              4
int count = (TOTAL/EACH);

产量

...
PUBLIC  _count
_DATA   SEGMENT
_count  DD  08H
_DATA   ENDS
END

其中表达式也是预先计算的。

当您传递编译时常量时,编译器在更高的优化级别甚至评估更复杂的表达式并不少见。例如,我曾经查看过交换两个整数的三种不同方法的代码,一旦我打开编译器的优化,就完全放弃了对 swap 方法的调用,用printf已经交换的值替换了我的测试参数。

于 2013-08-01T11:36:55.207 回答