sizeof(long)vs sizeof(* lp)

时间:2012-04-25 05:32:29

标签: c compiler-construction

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

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

将此更改为:

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

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

4 个答案:

答案 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