【发布时间】:2021-04-14 23:45:17
【问题描述】:
我有以下代码示例:
void foo(int size)
{
std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t>(size);
for(int i = 0; i < size; i += 2)
{
data[i] = 1;
data[i + 1] = 2;
}
}
实际代码会进行实际计算,但这对于这个问题并不重要,为了简单起见已将其删除。
在启用优化的情况下编译和运行此代码时,一切正常且运行迅速。 但是,在没有任何优化的情况下运行时,此代码比以下代码慢得多:
void foo(int size)
{
std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t>(size);
uint8_t* dataPtr = data.get();
for(int i = 0; i < size; i += 2)
{
dataPtr[i] = 1;
dataPtr[i + 1] = 2;
}
}
为了进一步研究这一点,我通过编译器资源管理器 (godbolt.org) 使用此动态数组运行了索引运算符的多个变体。 使用 clang 和 -O3 优化进行编译,所有变体都会产生相同的程序集。 但是,在没有任何优化的情况下进行编译,unique_ptr only 样本调用了 unique_ptr operator[],这似乎导致了速度变慢。
为什么没有优化的 unique_ptr 的 operator[] 会慢得多?从文档中我看到 operator[] 应该等同于 unique_ptr.get()[]。 它是否在没有优化的情况下进行了一些安全检查?如果有,有哪些?
【问题讨论】:
-
您看到的减速有多大? “很多”非常模糊。
标签: c++ performance optimization indexing unique-ptr