Tag: 微优化

取消设置单词中最重要的位(int32)

如何取消设置一个字的最重要的设置位(例如0x00556844 – > 0x00156844)? gcc中有__builtin_clz ,但它只计算零,这对我来说是不必要的。 另外,我应该如何为msvc或intel c编译器替换__builtin_clz? 目前我的代码是 int msb = 1<< ((sizeof(int)*8)-__builtin_clz(input)-1); int result = input & ~msb; 更新:好的,如果你说这段代码相当快,我会问你,我应该如何为这段代码添加可移植性? 这个版本适用于GCC,但是MSVC和ICC?

C指针与结构的直接成员访问

假设我有一个类似以下的结构…… typedef struct { int WheelCount; double MaxSpeed; } Vehicle; …我有一个这种类型的全局变量(我很清楚全局变量的缺陷,这是一个嵌入式系统,我没有设计,为此他们是一个不幸但必要的邪恶。 )直接或通过指针访问结构的成员是否更快? 即 double LocalSpeed = MyGlobal.MaxSpeed; 要么 double LocalSpeed = pMyGlobal->MaxSpeed; 我的任务之一是简化和修复最近inheritance的嵌入式系统。

在C中有效地提取double *的小数部分

我希望采用IEEE双精度并以最有效的方式删除它的任何整数部分。 我想要 1035 ->0 1045.23->0.23 253e-23=253e-23 我不关心正确处理非正规,无穷大或NaN。 我不介意有点麻烦,因为我知道我正在使用IEEE双打,所以它应该适用于各种机器。 无分支代码将是更受欢迎的。 我的第一个念头是(伪代码) char exp=d.exponent; (set the last bit of the exponent to 1) d<0); (& mask the last 52 bits of d) (shift d left until the last bit of the exponent is zero, decrementing exp each time) d.exponent=exp; 但问题是我无法想到一个有效的方法来向左移动直到指数的最后一位为零,而且如果没有设置所有最后一位,它似乎需要输出零。 这似乎与基数2对数问题有关。 对此算法或任何更好的算法的帮助将非常感激。 我应该注意到我想要无分支代码的原因是因为我希望它能有效地进行矢量化。

x86的MOV真的可以“免费”吗? 为什么我不能重现这个呢?

我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名。 对于我的生活,我无法在一个测试用例中validation这一点。 每个测试用例我尝试揭穿它。 例如,这是我用Visual C ++编译的代码: #include #include #include int main(void) { unsigned int k, l, j; clock_t tstart = clock(); for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j) { ++k; k = j; // <– comment out this line to remove the MOV instruction l += j; } […]