为什么C++编译器没有优化未使用的引用变量?
Why C++ compiler isn't optimizing unused reference variables?
考虑以下程序:
#include <iostream>
struct Test
{
int& ref1;
int& ref2;
int& ref3;
};
int main()
{
std::cout<<sizeof(Test)<<'n';
}
我知道c++编译器可以完全优化引用变量,这样它们就不会占用任何内存空间。
我测试了上面的演示程序来查看输出。但是当我编译&在g++ 4.8.1上运行它会给我输出12。看起来编译器没有优化引用变量。我期望测试结构体的大小为1。我也使用了-Os
命令行选项,但它仍然给我输出12。我也在msvs2010上试用了这个程序使用/Ox
命令行选项编译,但看起来微软编译器根本没有执行任何优化。
三个引用变量未使用&它们不与任何其他变量相关联。那么为什么编译器不优化它们呢?
结构体的大小保持不变,没有什么可优化的。如果您想创建一个Test
数组,它应该为每个Test
分配正确的大小。编译器无法知道将使用或不使用哪个。这就是为什么没有这样的优化。
int& int
。
理论上,如果世界只由简单程序组成,编译器可以将这个结构体的sizeof优化为1,因为结构体的sizeof是未指定的。
但是在我们的现实世界中,我们有单独的编译共享库,编译器在编译你的代码时没有任何提示(例如你可以LoadLibrary
或dlopen
),碰巧也定义了你的struct
,其中sizeof应该与你的程序中的sizeof一致。
所以实际上编译器最好不要把sizeof优化为1:)
在c++标准的8.3.2.4中,说
未指定引用是否需要存储
因此,标准将如何实现引用的问题留给了实现。这意味着struct的大小可以是非零的。
如果编译器将从结构体中删除引用,则无法链接使用不同编译器设置编译的代码。假设您编译了一个带有优化的翻译单元,而另一个没有,并将它们连接在一起,并将对象从一个TU传递到另一个TU。代码的大小应该是多少?tu1中的函数在堆栈上分配12个字节,而tu2中的函数在堆栈上分配一些其他空间。
编译器可以优化你的程序,例如删除临时对象,赋值等。您可能会在源代码的某个地方创建结构的对象并使用它,但在汇编代码中不会看到它,因为不需要它。编译器还经常删除间接访问,例如用直接访问代替引用。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++方法中的引用变量
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 使用更改此变量的函数在同一行中打印引用变量
- 将延迟变量分配给引用变量
- 如何通过引用获取引用变量的地址?
- 将引用变量传递给函数
- C++中引用变量的内存?
- 按名称存储和引用变量列表
- 返回一个C++引用变量 VS 返回一个变量
- c++ 在 if 语句中分配引用变量
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 在类范围内声明时,应在 C++14 中引用变量模板
- 当引用变量的引用"死亡"时,它会发生什么?
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 引用变量如何存储在mem中
- 引用变量存储在哪里