C++ (变量=&;另一个变量)的大小是多少

C++ (变量=&;另一个变量)的大小是多少,c++,reference,pass-by-reference,sizeof,C++,Reference,Pass By Reference,Sizeof,(变量=&anotherVar)的大小是多少 假设您讨论的是引用类型int&的物理大小,它几乎肯定与指针类型int*的大小相同,在现代体系结构(32位或64位处理器)中,指针类型通常为4或8字节 如果要在编译器上测量它,请使用以下方法: struct Test { int& x; } printf("%d\n", (int)sizeof(Test)); 还要注意,从技术上讲,编译器可能会填充测试结构并给出错误的答案,但这可能会很好地工作 请注意,sizeof(int&)与sizeof(

(变量=&anotherVar)的大小是多少


假设您讨论的是引用类型
int&
的物理大小,它几乎肯定与指针类型
int*
的大小相同,在现代体系结构(32位或64位处理器)中,指针类型通常为4或8字节

如果要在编译器上测量它,请使用以下方法:

struct Test { int& x; }
printf("%d\n", (int)sizeof(Test));
还要注意,从技术上讲,编译器可能会填充
测试
结构并给出错误的答案,但这可能会很好地工作


请注意,
sizeof(int&)
sizeof(int)
相同,并且没有确切地告诉您如果
int&
是数据成员,它将使用多少空间。

假设您讨论的是引用类型的物理大小
int&
,它几乎肯定与指针类型
int*
大小相同,在现代体系结构(32位或64位处理器)上通常为4或8字节

如果要在编译器上测量它,请使用以下方法:

struct Test { int& x; }
printf("%d\n", (int)sizeof(Test));
还要注意,从技术上讲,编译器可能会填充
测试
结构并给出错误的答案,但这可能会很好地工作


请注意,
sizeof(int&)
sizeof(int)
相同,并且没有确切地告诉您如果
int&
是数据成员,它将使用多少空间。

对引用或引用类型应用sizeof的结果是引用类型的大小。(C++03,5.3.3.2)


如果int是4字节(不一定是),那么引用也是如此。

对引用或引用类型应用sizeof的结果是引用类型的大小。(C++03,5.3.3.2)


如果int是4字节(不一定是),那么引用也是如此。

所以我认为您混淆了指针和引用

你问什么是(x=&y)

但是你的例子是一个参考(X&X=y)

我想你是说指针的大小是多少?它依赖于体系结构。要了解特定目标类型上的内容,请执行以下操作:

cout << sizeof(void*)

cout所以我认为您混淆了指针和引用

你问什么是(x=&y)

但是你的例子是一个参考(X&X=y)

我想你是说指针的大小是多少?它依赖于体系结构。要了解特定目标类型上的内容,请执行以下操作:

cout << sizeof(void*)
cout
未指定引用是否需要存储(C++11 8.3.2.4)

本案

int y = 10;
int & x = y;
编译器不得使用任何额外内存;它将只考虑<代码> x>代码>为<代码> y>代码>的别名。一旦
x
被初始化,它就不能被重新分配来引用另一个变量,因此编译器可以这样做

如果引用用作函数参数或类/结构中,则它可能在内部作为指针实现,因此大小将为
sizeof(int*)
。当然,如果带有引用参数的函数是内联的,那么就不需要额外的内存

未指定引用是否需要存储(C++11 8.3.2.4)

本案

int y = 10;
int & x = y;
编译器不得使用任何额外内存;它将只考虑<代码> x>代码>为<代码> y>代码>的别名。一旦
x
被初始化,它就不能被重新分配来引用另一个变量,因此编译器可以这样做


如果引用用作函数参数或类/结构中,则它可能在内部作为指针实现,因此大小将为
sizeof(int*)
。当然,如果内联了带有引用参数的函数,则不需要额外的内存。

一个简单的测试应该可以消除任何混淆:

#include <iostream>

using namespace std;

void f(char &r)
{
  cout << sizeof(r) << endl;
  cout << sizeof(&r) << endl;
}

int main()
{
  char x = 0;
  char &y = x;
  cout << sizeof(y) << endl;
  cout << sizeof(&y) << endl;
  f(x);
  return 0;
}

一个简单的测试可以消除任何混淆:

#include <iostream>

using namespace std;

void f(char &r)
{
  cout << sizeof(r) << endl;
  cout << sizeof(&r) << endl;
}

int main()
{
  char x = 0;
  char &y = x;
  cout << sizeof(y) << endl;
  cout << sizeof(&y) << endl;
  f(x);
  return 0;
}

不能在这方面引用标准,但32位或64位取决于目标CPU体系结构。@Corbin:它与y的大小相同吗?@faressoft可能是,但它没有定义为y,所以你不能指望它。你的问题是不一致的。(变量=&anotherVar)与类型&x+anotherVar不同。你问的是这两个问题中的哪一个?不能引用标准,但32位或64位取决于目标CPU体系结构。@Corbin:大小与y相同吗?@Faresoft可能是,但没有定义为y,所以你不能指望它。你的问题不一致。(变量=&anotherVar)与类型&x+anotherVar不同。你在问这两个问题中的哪一个?诚然,
sizeof(int&)
不会告诉你太多,但是
sizeof(int*)
会告诉你。但是
sizeof(Test)==sizeof(int*)
并没有得到标准的保证(我相信),甚至不考虑填充,尽管这对于几乎所有健全的体系结构/编译器来说都是正确的。。我敢打赌指针的作用方式与任何其他类型的指针一样——也就是说,如果结构没有打包,那么大小可能会变小。再次,关于结构打包的讨论超出了OP的范围:)诚然,
sizeof(int&)
不会告诉你太多,但是
sizeof(int*)
会。但是
sizeof(Test)==sizeof(int*)
并没有得到标准的保证(我相信),甚至不考虑填充,尽管这对于任何一个健全的体系结构/编译器来说都是正确的。。我敢打赌指针的作用方式与任何其他类型的指针一样——也就是说,如果结构没有打包,那么大小可能会变小。然后,关于结构打包的讨论也超出了OP的范围:)从技术上讲,您的第二个陈述是不正确的,除非该标准还保证sizeof始终且无误地返回类型的物理大小。根据第一条语句,char引用的sizeof()==1,但我真的怀疑char引用只有8位。这个答案是完全正确的,因为它谈到了“应用sizeof的结果”。这是参考资料透明度的必然结果。它可能回答也可能不回答实际问题(即