经常执行的一段代码有以下计算:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
将此更改为:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
导致更高的效率(因为在编译时计算的sizeof)或现代编译器已经在编译时处理它。 gcc做什么?
答案 0 :(得分: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_)
,因为它更通用,并且在更改变量类型时不需要手动调整(除非您从数组更改为指针时)。 / p>
0:除了可变长度数组。
1:尺寸因平台而异
答案 1 :(得分:2)
sizeof()
始终在编译时计算,因此没有区别。
答案 2 :(得分:0)
你可以通过写
完全免除这个部门tlen = ((long*)ep - (long*)cp);
我不确定这种方法的实施是否会更有效率。我的小实验没有结果。测试!
编辑:正如评论中所提到的,它仅在指针实际指向long(或适合持有longs的内存位置)时才有效。但如果它们没有在原始代码中,原始结果也没有意义,所以我推测它们是。
答案 3 :(得分:0)
不会导致性能差异,但会导致行为差异,具体取决于平台。例如:在Win x64上sizeof(long)将为4但sizeof(* lp)为8