将指向向量的指针转换为引用的成本
Cost of converting a pointer to a vector into a reference
我正在尝试使用指向 vector 的指针来访问 vector 的元素。我发现您可以执行类似于以下操作的操作:
std::vector<char> vector= { 'a', 'b','c','d' };
std::vector<char>* vecPointer = &vector;
std::vector<char>& vecReference = *vecPointer;
char value = vecReference[2];
但是,我担心费用。这比直接取消引用指针更好吗?我觉得应该是,因为它正在成为一个参考,但我不确定。
让我们逐行分析。
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) 编译为单个加载。
当然,我假设您启用了编译器优化。如果您完全关心性能,则必须这样做。
我正在尝试使用指向 vector 的指针来访问 vector 的元素。我发现您可以执行类似于以下操作的操作:
std::vector<char> vector= { 'a', 'b','c','d' };
std::vector<char>* vecPointer = &vector;
std::vector<char>& vecReference = *vecPointer;
char value = vecReference[2];
但是,我担心费用。这比直接取消引用指针更好吗?我觉得应该是,因为它正在成为一个参考,但我不确定。
让我们逐行分析。
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) 编译为单个加载。
当然,我假设您启用了编译器优化。如果您完全关心性能,则必须这样做。