编译器优化 - 是否可以优化C++类中引用的存储
compiler optimization - Can storage for references inside a C++ class be optimized away?
C++语言是否允许打印以下代码,例如 1 而不是 16?根据其他答案,我猜是的,但这种情况似乎没有被涵盖。
#include "iostream"
#include "cstdlib"
using namespace std;
struct as_array {
double &a, &b;
as_array(double& A, double& B)
: a(A), b(B) {}
double& operator[](const int i) {
switch (i) {
case 0:
return this->a;
break;
case 1:
return this->b;
break;
default:
abort();
}
}
};
int main() {
cout << sizeof(as_array) << endl;
}
标准在 [dcl.ref] 下说:
此外,由未指定引用是否需要存储
编译器决定对象的大小,因此您可以在此处获得任何非零数字。
还有假设规则(又名优化权限)。因此,当且仅当引用的使用方式需要时,编译器对这些引用使用存储是合法的。
说了这么多;为了有一个稳定的ABI,我仍然希望编译器为这些引用分配存储。
编译器
实现引用行为的方式 - 包括它们的存储位置和方式 - 未在C++标准中指定。 因此,一些编译器可以按照您的要求"打印例如 1 而不是 16"。
另外,return
后无需break
。
我相信
cout << sizeof(as_array) << endl;
始终返回两个指针在给定计算机上翻倍所需的存储空间,可能会扩展间隙以满足打包规则。优化确实意味着减少给定数据结构的存储大小。相反,编译器可以在现实世界中完全优化您的代码。因此,如果您有代码:
double a=100;
double b=200;
as_array arr(&a, &b);
std::cout << arr[0] << std::endl;
可以完全优化结构的存储,因为编译器知道如何通过代码处理值。但是 sizeof(arr) 的打印输出仍然为您提供结构的理论大小。
无论如何:如果你想获得更好的优化结果,你应该写更好的代码!使方法const
是否const
!如果您使用 c++11,请尽可能使用 constexpr。
相关文章:
- 现代编译器会优化只引用对象子集的局部变量吗
- 当编译时已知引用占用结构中的空间时,是否错过了优化?
- C++14 通过引用返回一个值以优化性能
- 未优化的 constexpr 的未定义引用用作默认参数
- 常量右值引用是否允许对编译器进行额外优化?
- 使用通过引用(通过指针)传递的参数优化 OpenCL 函数中的指针访问
- 编译器是否优化了对常数变量的引用
- c++链接器错误:未定义的引用仅在优化的生成上
- 当函数参数是常量引用临时或按值复制的临时时,为什么 MSVC 优化会破坏 SSE 代码
- 全局指针由优化器解析 - 但引用不是 - 为什么
- 是否允许C++编译器优化未引用的本地对象
- 优化器删除指针取消引用行
- C++强制对变量引用进行编译优化,使之成为直接的
- 一个好的C++编译器会优化一个引用吗
- C++常量引用参数优化
- 为什么C++编译器没有优化未使用的引用变量?
- c++对std::shared_ptr引用的reinterpret_cast进行优化
- 构造函数中的通用引用和返回值优化(rvo)
- 在c++中,如果返回一个指针并立即解引用,这两个操作会被优化掉吗?
- 编译器能优化从拷贝到引用的返回值吗?