微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与 asm volatile 相比,我们需要使用一些运行时内存栅栏机制

如何解决与 asm volatile 相比,我们需要使用一些运行时内存栅栏机制

假设我们有这样一段 C++ 代码

auto t1 = getSystemTime(); // Statement 1
foo();                     // Statement 2
auto t2 = getSystemTime(); // Statement 3

auto elapsedtime = t2 - t1;

据我所知,编译器可能会优化代码,这意味着只有在不违反 as-if 规则的情况下,它才会重新排序执行顺序。比如下面代码的执行顺序

c = a + b;
d = e + f;

可以重新排序为

d = e + f;
c = a + b;

因此,上面的代码可以重新排序如下:

auto t1 = getSystemTime(); // Statement 1
auto t2 = getSystemTime(); // Statement 3
foo();                     // Statement 2

auto elapsedtime = t2 - t1;

产生完全不同的结果。

在谷歌搜索这个问题后,我得到了这个:__asm__ __volatile__ ("" ::: "memory");。如果我是对的,通过这一行,我们可以禁用编译器的优化,这样执行顺序就不会重新排序。

如果我正确使用它,代码将如下所示:

__asm__ __volatile__ ("" ::: "memory");
auto t1 = getSystemTime(); // Statement 1
foo();                     // Statement 2
auto t2 = getSystemTime(); // Statement 3

auto elapsedtime = t2 - t1;

然而,在阅读了一些文档后,我发现 __asm__ __volatile__ ("" ::: "memory"); 只是关于编译时,而不是运行时。

现在我很困惑。如果 __asm__ __volatile__ ("" ::: "memory"); 仅在编译时有效,是否意味着它完全没有用,因为执行顺序仍然可以在运行时更改?如果是这样,是否有其他机制禁止在运行时重新排序?或者没有任何其他机制可以在运行时重新排序执行顺序,但使用 __asm__ __volatile__ ("" ::: "memory"); 我们可以降低重新排序的概率?

此外,我们在 C++11 中有 memory order,内存顺序可以帮助解决这个问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。