一段经常执行的代码有以下计算:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
将其更改为:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
导致更高的效率(因为在编译时计算的 sizeof )或者现代编译器已经在编译时处理这个问题。gcc 是做什么的?
一段经常执行的代码有以下计算:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
将其更改为:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
导致更高的效率(因为在编译时计算的 sizeof )或者现代编译器已经在编译时处理这个问题。gcc 是做什么的?
该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:尺寸因平台而异
sizeof()
总是在编译时计算,所以没有区别。
您可以通过编写完全省去除法
tlen = ((long*)ep - (long*)cp);
我不确定这是否会更有效。我的小实验没有结果。测试!
编辑:正如评论中所提到的,它仅在指针实际指向 long(或适合保存 long 的内存位置)时才有效。但如果他们没有在原始代码中,原始结果也没有意义,所以我假设他们是。
不会导致性能差异,但会导致取决于平台的行为差异。例如:在 Win x64 上 sizeof(long) 将为 4 但 sizeof(*lp) 为 8