【问题标题】:What is the size of ( variable = &anotherVar )( variable = &anotherVar ) 的大小是多少
【发布时间】:2012-04-08 14:15:17
【问题描述】:

(variable = &anotherVar) 的大小是多少

int y = 10; // the size of y is 4 bytes
int & x = y; // what is the size of x that receives the address of y

【问题讨论】:

  • 不能引用标准,但 32 位或 64 位取决于目标 CPU 架构。
  • @Corbin : 和 y 的大小一样吗?
  • @faressoft 可能,但它没有被定义为那样,所以你不能指望它。
  • 您的问题不一致。 (variable = & anotherVar) 与 type & x + anothervar 不同。你问的是哪两个问题?

标签: c++ reference pass-by-reference sizeof


【解决方案1】:

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

如果你想在你的编译器上测量它,使用这个:

struct Test { int& x; }
printf("%d\n", (int)sizeof(Test));

还请注意,从技术上讲,您的编译器可能会填充 Test 结构并给您错误的答案,但这可能会正常工作。

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

【讨论】:

  • 确实sizeof(int&) 不会告诉你太多,但sizeof(int*) 会。
  • 但是sizeof(Test) == sizeof(int*) 并不受标准的保证(我相信),甚至不考虑填充,尽管对于几乎所有健全的架构/编译器都是如此。
  • An overview of this topic。我敢打赌,指针因素与任何其他类型的因素相同——也就是说,如果结构没有被打包,那么大小可能会关闭。再说一次,关于结构包装的讨论超出了 OP 的范围 :)
【解决方案2】:

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

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

【讨论】:

  • 从技术上讲,您的第二个陈述是不正确的,除非该标准还保证 sizeof 始终且无误地返回类型的物理大小。通过第一条语句,char 引用的 sizeof() == 1,但我真的怀疑对 char 的引用只有 8 位。
  • 这个答案是完全正确的,因为它谈到了“应用 sizeof 的结果”。这是参考文献透明度的必然结果。它可能会或可能不会回答实际问题(这有点模棱两可)。
【解决方案3】:

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

你问什么是 (x = &y) ?

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

我想你的意思是指针的大小是多少?它依赖于架构。要了解它在您的特定目标类型上是什么:

cout << sizeof(void*)

【讨论】:

    【解决方案4】:

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

    案例

    int y = 10;
    int & x = y;
    

    编译器可能不会使用任何额外的内存;它只会将x 视为y 的别名。一旦 x 被初始化,它就不能被重新分配来引用另一个变量,所以编译器可以这样做。

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

    【讨论】:

      【解决方案5】:

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

      #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;
      }
      

      输出(编译为 x86 32 位程序):

      1
      4
      1
      4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 2012-06-30
        • 2011-03-13
        • 1970-01-01
        • 2011-10-08
        相关资源
        最近更新 更多