2019年5月(或以后)发布的GCC版本无法优化这段代码:
owner
可以看到here(GodBolt):clang不会对GCC和MSVC正确地优化此代码。这是GCC bug 90271,它将在某个时候被修复。但是-它不会针对今天发布的GCC版本而修复,我今天想编写这段代码...
那么:有没有一种解决方法可以使GCC为此功能生成与clang相同的代码,或者至少-具有相当性能的代码,将数据保存在寄存器中,而不求助于指针和堆栈?
注意:
答案 0 :(得分:7)
这使非内联版本更长一些,但是内联版本针对所有三个编译器进行了优化:
int replace_bytes(int v1 ,char v2, size_t k)
{
return (v1 & ~(0xFF << k * 8)) | ((unsigned char)v2 << k * 8);
}
如果v2
是带符号类型,则必须在转换前将unsigned char
强制转换为char
。在这种情况下,如果没有大小写,v2
将被符号扩展为整数,这将导致结果中不需要的位被设置为1。