编译器优化 - 是否可以优化C++类中引用的存储

compiler optimization - Can storage for references inside a C++ class be optimized away?

本文关键字:优化 引用 存储 是否 编译器 C++      更新时间:2023-10-16

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。