64位环境中引用的大小

时间:2010-09-19 05:54:37

标签: c++ 64-bit

在SO(References Vs Variable Gets)上浏览对另一个问题的回复时遇到了这个问题。 我的问题是,对于所有64位环境,即使原始版本的尺寸较小,它也能保证对变量的引用为64位吗?在64位环境中的char引用中,> sizeof(char)?标准中是否有明确规定的部分?

编辑:为了更清晰 - char c1 ='a'; 焦炭和放大器; c2 = c1; 我的问题是sizeof(c2)> 64位机器中的sizeof(c1)?

3 个答案:

答案 0 :(得分:13)

标准(ISO C ++ - 03)说明了关于参考文献

的内容

It is unspecified whether or not a reference requires storage (3.7).

如果我错了或者我没有正确理解他的问题,请有人纠正我。

修改

  

我的问题是sizeof(c2)> 64位机器中的sizeof(c1)?

不,当@Chubsdad注意到sizeof(c2) = sizeof (c1)时,标准的相关引用是

When applied to a reference or a reference type, the result is the size of the referenced type。 (ISO C ++ $ 5.3.3 / 2)

答案 1 :(得分:8)

$ 8.3.2 / 3 - It is unspecified whether or not a reference requires storage.

应用于引用的sizeof基本上是引用的大小。

因此,如果'r'是对'i'的整数引用,则如果存在'r'的实际存储,则未指定。但是sizeof(r)内部代表sizeof(i)

如果'r'是对'char'的引用,则根据定义sizeof(r)始终为sizeof(char) == 1

答案 2 :(得分:4)

虽然sizeof(ref_var)返回引用对象的大小,但仍然需要空间来存储结构中的引用,例如,在通常的实现中,分配用于存储引用的空间与分配的空间相同存储指针。标准可能不需要这样,但这段代码至少显示了效果:

#include <iostream>
using namespace std;

char  c1 = 'a';
char &c2 = c1;
struct x
{
    char  c1;
    char  c2;
    char  c3;
    char  c4;
    int   i4a;
    char &r1; 
    int   i4b;
    int   i4c;
    x() : r1(c1) { }
};
struct y
{
    char  c1;
    char  c2;
    char  c3;
    char  c4;
    int   i4a;
    int   i4b;
    int   i4c;
};
int main()
{
    cout << sizeof(c2) << endl;
    cout << sizeof(y) << endl;
    cout << sizeof(x) << endl;
    return 0;
}

我没有假装它是'伟大的代码' - 它不是 - 但它证明了一点。在MacOS X 10.6.4上使用GNU编译器集合(GCC 4.5.1)中的C ++编译器在默认(64位)模式下编译,输出为:

1
16
24

在32位模式下编译时,输出为:

1
16
20

第一行输出表明'sizeof(ref_var)确实返回了引用对象的大小。第二行显示其中没有引用的结构的大小为16个字节。第三行显示了一个非常相似的结构,其中一个8字节边界嵌入了一个引用(在sizeof(int) == 4的系统上)比64位编译下的简单结构大8字节,大4字节在32位编译下。通过推断,在64位编译下,结构的引用部分占用超过4个字节且不超过8个字节,并且在32位编译下占用不超过4个字节。这表明(在至少一个C ++的流行实现中)结构中的引用占用与指针相同的空间量 - 正如在其他一些答案中所声明的那样。

因此,它可能依赖于实现,但是引用占据与指针相同的空间的注释在至少一个(相当广泛使用的)实现中保持为真。