【问题标题】:Can storage for references inside a C++ class be optimized away?可以优化 C++ 类中的引用存储吗?
【发布时间】:2015-06-16 05:49:54
【问题描述】:

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

【问题讨论】:

  • “但是这个案子似乎没有被特别报道” - 你觉得你的案子有什么特别的地方没有被报道?只是引用是类成员?
  • 我错过了什么吗?由于ab 是独立的引用,除了为两个指针分配空间之外,编译器将如何实现该结构?
  • > 你觉得你的案子有什么特别的地方没有被涵盖?是的,事实上引用是类成员

标签: c++ compiler-optimization


【解决方案1】:

标准在 [dcl.ref] 下说:

未指定引用是否需要存储

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

还有 as-if 规则(又名优化许可)。因此,当且仅当引用的使用方式需要时,编译器为这些引用使用存储是合法的。

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

【讨论】:

    【解决方案2】:

    编译器实现引用行为的方式 - 包括它们的存储位置和方式 - 在 C++ 标准中没有指定。因此,某些编译器可能会按照您的要求“打印例如 1 而不是 16”。

    另外,您不需要在returning 之后break

    【讨论】:

      【解决方案3】:

      我相信

      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。

      【讨论】:

      • 是什么让你相信?
      • 结构的定义在第一步中独立于使用。因此,如果您“询问”编译器该理论大小,在这种情况下应该优化什么?在不知道用例的情况下,没有什么可以优化掉的。我不是语言律师,但是在不知道其他任何内容的情况下,应该如何优化给定的大小?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多