在实现无锁数据结构和时间代码时,往往需要抑制编译器的优化。 通常情况下,人们在clobber列表中使用asm volatile和memory来做这件事,但是有时你会看到只是asm volatile或只是一个简单的asm clobbering memory。 这些不同的语句对代码生成有什么影响(特别是在GCC中,因为它不太可能是便携式的)? 仅供参考,这些是有趣的变化: asm (""); // presumably this has no effect on code generation asm volatile (""); asm ("" ::: "memory"); asm volatile ("" ::: "memory");
与我的另一个问题相关 ,请帮我debugging“未知的模块中发生未处理的typesSystem.AccessViolationException的exception其他信息:尝试读取或写入受保护的内存,这往往表明其他内存已损坏。 通过代码,一切工作,直到del()的实际调用,并在该行失败。 这段代码是基于这篇文章的示例和这个在python中工作的python代码 。 我无法得到代码示例,要么(同样的例外),但我希望这只是一点点过时或什么。 编辑:看看编辑历史,如果你关心我们如何到达这里,这是无趣的。 完成的工作版本: public static class CpuID { public static byte[] Invoke(int level) { IntPtr codePointer = IntPtr.Zero; try { // compile byte[] codeBytes; if (IntPtr.Size == 4) { codeBytes = x86CodeBytes; } else { codeBytes = x64CodeBytes; } codePointer = VirtualAlloc( IntPtr.Zero, new UIntPtr((uint)codeBytes.Length), AllocationType.COMMIT | AllocationType.RESERVE, MemoryProtection.EXECUTE_READWRITE ); […]