在SO(References Vs Variable Gets)上浏览对另一个问题的回复时遇到了这个问题。 我的问题是,对于所有64位环境,即使原始版本的尺寸较小,它也能保证对变量的引用为64位吗?在64位环境中的char引用中,> sizeof(char)?标准中是否有明确规定的部分?
编辑:为了更清晰 - char c1 ='a'; 焦炭和放大器; c2 = c1; 我的问题是sizeof(c2)> 64位机器中的sizeof(c1)?
答案 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 ++的流行实现中)结构中的引用占用与指针相同的空间量 - 正如在其他一些答案中所声明的那样。
因此,它可能依赖于实现,但是引用占据与指针相同的空间的注释在至少一个(相当广泛使用的)实现中保持为真。