gpt4 book ai didi

c++ - [[可能]] 和 [[不太可能]] 影响程序汇编的简单示例?

转载 作者:行者123 更新时间:2023-12-01 09:14:47 25 4
gpt4 key购买 nike

C++20 引入了属性 [[likely]][[unlikely]]到语言,它可用于允许编译器针对一种执行路径比其他执行路径更有可能或更不可能的情况进行优化。

考虑到错误分支预测的成本,这似乎是一个在代码的性能关键部分可能非常有用的功能,但我不知道它实际上会导致编译器做什么。

是否有一段简单的代码添加 [[likely]][[unlikely]]属性更改编译器的程序集输出? 也许更重要的是,这些变化有什么作用?

我为自己的理解创建了一个简单的示例,以查看程序集是否有任何差异,但似乎这个示例太简单了,无法实际显示对程序集的任何更改:

void true_path();
void false_path();

void foo(int i) {
if(i) {
true_path();
} else {
false_path();
}
}
void bar(int i) {
if(i) [[likely]] {
true_path();
} else [[unlikely]] {
false_path();
}
}

View the compiled assembly here.

最佳答案

看起来,gcc 中有一个错误。如果你有两个相同的函数,除了 [[likely]]属性,gcc 错误地折叠它们。

但是如果你只使用一个功能,并在 [[likely]] 之间切换/[[unlikely]] , assembly 变化。

所以,这个函数:

void bar(int i) {
if(i) [[unlikely]] {
true_path();
} else [[likely]] {
false_path();
}
}

编译为:
bar(int):
test edi, edi
jne .L4
jmp false_path()
.L4:
jmp true_path()

和这个:
void bar(int i) {
if(i) [[likely]] {
true_path();
} else [[unlikely]] {
false_path();
}
}

编译为:
bar(int):
test edi, edi
je .L2
jmp true_path()
.L2:
jmp false_path()

注意,条件已经改变:第一个版本跳转,如果 i非零,而如果 i,则第二个跳转为零。

这与属性一致:gcc 生成代码,其中条件跳转发生在不太可能的路径中。

关于c++ - [[可能]] 和 [[不太可能]] 影响程序汇编的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62222212/

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