- 论坛徽章:
- 2
|
引用不占空间的说法是流传很广的误会…… 造成该误会的原因可能有:
1. 自动变量优化
int是否占用空间? 这个不好说, 但int能sizeof, 能用 & 取到地址(非register)是肯定的。
- int f(int x, int y) {
- int xx = x*x;
- int yy = y*y;
- int a = xx + yy;
- return a;
- }
复制代码 xx,yy,a是否占空间? 优化开高了也许就不占了, 直接寄存器干活。
x/y是否占空间? 至少i386上 cdecl 调用约定是占的。
2. 无法取得变量本身的地址
sizeof得到的是被引用对象的大小, & 得到的是被引用对象的地址。
因为引用语意的关系, 没办法"直接"获得引用变量本身的大小与地址信息
可能也造成了该误会……
类似Windows下的dll导入机制:
- __declspec(dllimport) double x;
复制代码 实际上类似这样的代码
- extern double* __imp_x;
- #define x (*__imp_x);
复制代码 通过x宏, 没法取得 __imp_x 的大小与地址。
C++没有规定引用如何实现。 但在i386上, cl/gcc/clang实现都类似这样。
3. 绕过语法糖干扰
最简单的方法:
- struct X { double& d; };
- enum { size = sizeof(X) }; // 该平台上引用大小
- double d;
- X x = { d };
- void* address = &x; // 引用变量的地址
- unsigned char representation[sizeof(X)];
- memcpy(representation, address, sizeof x); // 可查看引用变量的表示
复制代码 其他还有很多方法阻止编译器优化, 比如参数, 静态变量…… 不过都比结构体复杂。
4. 小结
C++ (印象中)没有详细描述引用变量的实现方式。
但在 i386(cl/gcc/clang) 下, 引用 —— 如同 int —— 是有大小的, 可以用 3 的方式得到
自动变量的空间(无论是否是引用)都有可能被优化。 |
|