【发布时间】:2020-11-29 22:56:24
【问题描述】:
我在 godbolt.org 上使用 -O2 编译此代码,编译器不会使用一些 memcpy 对其进行优化,而是诚实地运行循环。
void foo(int* dst, int* src, int n)
{
for (int i = 0; i < n; ++i)
{
dst[i] = src[i];
}
}
但如果我将“= src[i]”替换为“= 0”,他们会使用 memset。但是同样,当我用“= 1”替换它时,它们会运行一个循环。当要设置的值不为零时,为什么他们避免使用 memcpy 和 memset ?我认为这是他们将执行的首批优化之一。
【问题讨论】:
-
g++和clang++似乎都可以更好地优化std::copy_n(src, n, dst);(无论如何你都应该使用它) -
我认为
memcpy永远不会与该函数签名一起使用。如果数组重叠,memcpy会导致 UB。memmove更有可能。使用template<unsigned N> void foo(int (&dst)[N], int (&src)[N]) { { for(unsigned i = 0; i < N; ++i) { dst[i] = src[i]; } }你会得到memcpy和clang++和rep movsq和g++
标签: c++ performance loops optimization compiler-optimization