【问题标题】:Cost of converting a pointer to a vector into a reference将指向向量的指针转换为引用的成本
【发布时间】:2021-07-11 22:30:31
【问题描述】:

我正在尝试通过使用指向它的指针来访问向量的元素。我发现您可以执行类似以下的操作:

std::vector<char> vector= { 'a', 'b','c','d' };
std::vector<char>* vecPointer = &vector;
std::vector<char>& vecReference = *vecPointer;
char value = vecReference[2];

但是,我担心成本。这比直接取消引用指针更好吗?我觉得应该是,因为它正在成为参考,但我不确定。

【问题讨论】:

  • 这里没有转换或复制。这基本上是免费的。
  • 您可以随时查看编译后的代码,看看引用是否会产生任何类型的开销。在这种情况下,C++ 标准不需要任何特定的行为或结果,因此不同的编译器之间的结果可能会有所不同,甚至可能使用相同的编译器使用不同的优化编译选项。所以,如果你想知道这里的答案,你需要自己弄清楚,看看你的编译器是如何编译上面的代码的。
  • 如果有任何成本,通常会由编译器承担(例如优化代码以消除随后不使用或不需要的变量)。从概念上讲,编译器可以选择在运行时进行一些复杂的计算,以将指针转换为引用。实际上,即使在没有优化的情况下进行编译,编译器也不需要这样做,因为它拥有自己进行转换所需的所有信息——现代编译器没有。
  • 您可能还想了解“过早优化”的概念。

标签: c++ pointers reference dereference


【解决方案1】:

让我们一行一行地来吧。

std::vector<char> vector= { 'a', 'b', 'c', 'd' };

这似乎是您必须支付的成本,但为了完整起见,复制元素的 O(n) 加上一个内存分配(这可能有点贵)。如果您总是有 4 个元素,请使用 std::array 以避免内存分配成本。

std::vector<char>* vecPointer = &vector;

这没有任何成本,您只是为现有事物创建一个新名称。

std::vector<char>& vecReference = *vecPointer;

这不花钱,和上面一样。

char value = vecReference[2];

这与您使用(*vecPointer)[2]vector[2] 的成本完全相同。它应该从一个地址(存储在向量中)加上一个偏移量 (2) 编译为单个加载。

当然,我假设您启用了编译器优化。如果您完全关心性能,您必须这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多