是否可以优化C ++类中的引用存储?

时间:2015-06-16 05:49:54

标签: c++ compiler-optimization

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

3 个答案:

答案 0 :(得分:5)

标准在[dcl.ref]下说:

  

未指明引用是否需要存储

此外,由编译器决定对象的大小,因此您可以在此处获得任何非零数字。

还有as-if规则(也称为优化权限)。因此,当且仅当使用引用的方式需要它时,编译器才能为这些引用使用存储是合法的。

说完了这一切;为了获得稳定的ABI,我仍然希望编译器为这些引用分配存储空间。

答案 1 :(得分:2)

编译器实现引用行为的方式 - 包括它们存储的位置和方式 - 未在C ++标准中指定。因此,一些编译器可以打印例如1而不是16&#34;如你所知。

另外,break之后你不需要return

答案 2 :(得分:2)

我相信

cout << sizeof(as_array) << endl;

总是返回指定机器上两个指针加倍所需的存储空间,可能会延长空隙以满足打包规则。优化的确意味着减少给定数据结构的存储大小。相反,编译器可以在真实场景中完全优化您的代码。所以如果你有代码:

double a=100;
double b=200;
as_array arr(&a, &b);
std::cout << arr[0] << std::endl;

可以导致结构的存储优化完全消失,因为编译器知道如何通过代码处理值。但是printof sizeof(arr)仍然给出了结构的理论大小。

无论如何:如果你想更好地优化结果,你应该编写更好的代码!方法const如果是const!如果使用c ++ 11,请尽可能使用constexpr。

相关问题