- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 CodeBlocks 12.11 附带的 MinGW 版本时没有遇到任何问题。但现在我试图编译 SyncSys .编译 enet 没有问题,但是用 gcc/MinGW 编译 SyncSys 本身会带来错误,我不能使用函数 _InterlockedOr8 因为它没有声明。研究导致 _InterlockedOr8 在 intrin.h 中定义。 intrin.h 不包括在内,我在 MinGW/gcc 上搜索了它的等效项:x86intrin.h。但这仍然不起作用。 InterlockedOr8将是要调用的“真实”函数,但编译器也无法找到它,尽管包含 winbase.h 和 windows.h。
在研究这个问题时,很少有我无法从中学习的命中率。我该如何解决这个问题?
最佳答案
_InterlockedOr8 是 Microsoft 编译器独有的内部编译器函数 - 这意味着编译器会自动将实现内联到代码中,而不是与库链接。 <intr.h>
是与 Visual Studio 一起分发的头文件,独立于 Windows SDK。
如果您不能切换到 Visual Studio (free download, btw),那么您可以定义您自己的此函数的替换版本:
void InterlockedOr8(char* dst, char src)
{
__asm
{
mov eax, dst ; EAX = dst
mov cl, src ; ECX = src
lock or [eax], cl ; *dst = src | *dst; // this is the actual interlocked-or op
}
}
请注意,此函数与 _InterlockedOr8 的不同之处在于它不返回 *dst 的原始值。如果您需要返回值,实现会变得更加复杂。我快速查看了 SyncSys 源代码。需要该函数的两个地方不需要返回值。所以你所要做的就是将上面的代码转换为使用内联汇编的 gcc 风格。
更新
这是一个在 OR 操作之前正确返回目标地址内的原始值的版本。它可能需要一些代码审查审查......
char MyInterlockedOr8(char* dst, char src)
{
char result = 0;
const size_t ptr_size = sizeof(dst);
_asm
{
mov esi, dst ; esi = dst
mov cl, src ; cl = src // keep "src" cached in a register
mov al, [esi] ; al = *dst
start:
mov bl, cl ; bl = src
or bl, al ; bl = src | *dst
lock cmpxchg [esi], bl; // if (*dst == eax) { *dst=bl ;} else {al = *dst};
jne start
mov result, al ; result = al
}
return result;
}
关于c++ - gcc MinGW 上的 InterlockedOr8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20930196/
我是一名优秀的程序员,十分优秀!