1

一段经常执行的代码有以下计算:

long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);

将其更改为:

long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);

导致更高的效率(因为在编译时计算的 sizeof )或者现代编译器已经在编译时处理这个问题。gcc 是做什么的?

4

4 回答 4

9

sizeof运算符始终是编译时评估的构造0,因此没有区别。

片段...

 tlen = (ep - cp) / sizeof (*lp);

因此将被转化为类似的东西......

 tlen = (ep - cp) / 4;

(假设sizeof(long)==4 1。),应用了优化,下一个转换可能是......

 tlen = (ep - cp) >> 2;

当然,还会有更多优化;这只是证明它是编译时构造0的可能结果。

我总是更喜欢"sizeof(_var-name_)"sizeof(_typename_)因为它更通用,并且在更改变量的类型时不需要手动调整(从数组更改为指针时除外)。


0:可变长度数组除外。

1:尺寸因平台而异

于 2012-04-25T05:36:42.300 回答
2

sizeof()总是在编译时计算,所以没有区别。

于 2012-04-25T05:33:53.980 回答
0

您可以通过编写完全省去除法

tlen = ((long*)ep - (long*)cp);

我不确定这是否会更有效。我的小实验没有结果。测试!

编辑:正如评论中所提到的,它仅在指针实际指向 long(或适合保存 long 的内存位置)时才有效。但如果他们没有在原始代码中,原始结果也没有意义,所以我假设他们是。

于 2012-04-25T05:45:50.060 回答
0

不会导致性能差异,但会导致取决于平台的行为差异。例如:在 Win x64 上 sizeof(long) 将为 4 但 sizeof(*lp) 为 8

于 2012-04-25T11:59:40.080 回答