gpt4 book ai didi

c++ - 内存屏障会驯服 Microsoft 的优化器吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:09 24 4
gpt4 key购买 nike

我正在开发一个多平台、多编译器库。该库具有以下宏:

#if defined(_MSC_VER) && (_MSC_VER >= 1400)
# pragma intrinsic(_ReadWriteBarrier)
# define MEMORY_BARRIER() _ReadWriteBarrier()
#elif ...
#elif defined(__GNUC__)
# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory")
#else
# define MEMORY_BARRIER()
#endif

在 GCC 下,上面的代码可以用来驯服优化器。虽然该函数名为 MEMORY_BARRIER,但重要的部分是标记为 volatile 的内联程序集。这是在 GCC、Clang 和 Intel 下驯服优化器的部分。

编辑:尽管 Clang 通过定义 __GNUC__ 声称是 GCC,但内联汇编并未驯服 Clang 上的优化器。参见 LLVM Bug 15495 - dead store pass ignores memory clobbering asm statement .

宏的使用是一个handle类。 handle 提供了一个级别和间接,我们正试图引入一个 NULL 指针解引用来帮助定位错误(有些人放弃了)。为了实现我们的目标,我们需要确保优化器不会删除死存储 (m_p = NULL;):

template <class T> handle<T>::~handle()
{
delete m_p;
m_p = NULL;

MEMORY_BARRIER();
}

我不想使用 volatile 转换,因为 (1) 我不相信它是对限定符的正确使用(取自与 Clang 和 GCC 开发人员的交互),并且 ( 2) 看起来 volatile 转换在 C++ 中是未定义的行为(参见 Approved way to avoid lvalue cast warnings and errors?)。

内存屏障是否会驯服 Microsoft 平台上的优化器?

最佳答案

在 GCC 编译器下,您可以使用编译器指令手动关闭选定函数的优化,如下例所示。

#pragma GCC push_options
#pragma GCC optimize ("O0")
static inline void MEMORY_BARRIER() {
// your code
}
#pragma GCC pop_options

在 VC 编译器下,您可以使用编译器指令手动关闭选定函数的优化,如下例所示。

#pragma optimize( "", off )
static inline void MEMORY_BARRIER() {
// your code
}
#pragma optimize( "", on )

也许您可以使用这些技巧来获得您想要的东西?

不幸的是,我现在不知道如何在 clang/llvm 或英特尔编译器下执行类似的操作。

关于c++ - 内存屏障会驯服 Microsoft 的优化器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com