我的同事和我自己未能解释为什么GCC,ICC和Clang无法优化此功能
void f(std::uint64_t a, void * p) {
std::uint8_t *x = reinterpret_cast<std::uint8_t *>(p);
x[7] = a >> 56;
x[6] = a >> 48;
x[5] = a >> 40;
x[4] = a >> 32;
x[3] = a >> 24;
x[2] = a >> 16;
x[1] = a >> 8;
x[0] = a;
}
入这个
mov QWORD PTR [rsi], rdi
如果我们根据
f
来表示memcpy
,则它仅发出该mov
。如果我们执行看似微不足道的字节写入序列,为什么要使用does it not happen? 最佳答案
我不是专家,但是gcc仅在gcc 7中获得了合并相邻存储以获取立即常量的功能:
如果我不得不猜测第二个错误,那么等待可能不会太长。
关于c++ - 为什么未将这8个字节写入优化为MOV?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46898268/