vc++和GCC中针对64位机器的整数字面值的大小

Size of an integer literal in VC++ and GCC targeting 64-bit machines

本文关键字:整数 字面值 机器 64位 GCC vc++      更新时间:2023-10-16

我正在编写面向高性能的跨平台x86/x86-64/Itanium代码,希望避免任何不必要的操作,包括不必要的类型转换。

我调用的函数是这样的:

int theResult = Function(anUInt, 10);

显然,没有指定10值的类型。Function是这样定义的:

int Function (unsigned int anUInt, int anInt)
{
    // ...
}

我的假设是,使用vc++和GCC针对x86机器,整数字面值的大小为4字节,因此在输入上述函数时将10值分配给anInt参数时不需要执行类型转换(int值的大小几乎在每个数据模型中都是4)。有些人可能不认为它是这个假设的最终证明,但是sizeof(1)确实在vc++和为x86架构编译的GCC代码中返回4。我想,如果64位机器上的整数字面值的大小是8个字节,那么8个字节的10值必须转换为4个字节的anInt参数,如果经常调用Function(这就是我的程序中的情况),则会降低性能。

那么,在vc++和GCC代码中,为64位架构(如x86-64或Itanium)编译的整数字面值的大小是4,还是8?换句话说,sizeof(1)在vc++和针对64位机器的GCC代码中返回什么?对于Itanium (IA-64)架构有什么特殊情况吗?

编辑:将"untyped integer"改为"integer literal"。

在c++中没有"无类型整数"这种东西。虽然您可能没有指定类型的显式性,但它确实有一个类型,并且可以依赖该类型。《标准》说:

2.13.1整数字面值

2 整数字面值的类型取决于它的形式、值和后缀。如果它是十进制且没有后缀,则它具有这些类型中的第一个它的值可以表示为:int, long int;如果值不能如果表示为长整型,则行为未定义。如果是的话八进制或十六进制,没有后缀,它有其中的第一个可以表示其值的类型:int, unsigned int, longInt, unsigned long Int。如果以u或u为后缀,则其类型为可以表示其值的第一种类型:unsignedInt, unsigned long Int。如果以l或l为后缀,则其类型为首先是其值可以表示的类型:long int,Unsigned long int。如果后缀为ul、lu、ul、lu、ul、lu、ul或

,其类型为unsigned long int。

整数字量的类型(例如10)默认为int *

所以它是4还是8字节取决于你的平台上int的大小(我怀疑你提到的两个平台都是4)。

*参见c++(03)标准第2.14节中的表;它描述了如何选择整数字面值的类型。

看来你正在做一个经典的错误:过早优化。顺便说一下,它被称为"万恶之源"。如果您想编写一个快速的应用程序,那么编写它,配置它(使用valgrind或其他类似的工具),然后优化慢的部分。首先使用已知的数据结构和算法理论,但其他优化留给编译器。如果你真的确定需要的话,告诉它内联你的函数,但编译器可能还是会这样做。

另外,你似乎对整数大小的工作方式感到困惑。您将程序编译为32位或64位大小,然后您可以在64位架构上运行32位和64位程序。在所有情况下,整型就是整型。如果将其编译为32位,则int值为4字节。如果将它编译为64位,则它们是8个字节。在任何情况下,在运行时对文字整数都没有提升或降级。当您在64位硬件上运行32位程序时,可能会有8字节的4字节整数存储,但这只是硬件决定执行您的程序的方式,并且对您的程序完全不可见,并且不会导致它运行得更慢。在64位硬件上运行32位应用程序;操作系统通常会导致几个百分点的损失,所以如果你真的需要这样的性能,你应该发布一个专门的64位版本。

似乎你的问题可能真的是"在为64位硬件编译时有多少字节是int",因为假设它可能是或可能不是8字节是导致你担心会有性能问题的原因。答案似乎是:"int"在32位GCC和64位GCC上都是4字节长。所以,你最初的担心是没有意义的;尺寸相同,因此不需要升级或降级。

整型文字的类型转换将在编译时进行,而不是在运行时进行。编译器应该选择最合适的指令来加载该值,因为它将被表达式的其余部分使用。