c++ - 在 std 运算符重载上选择性地强制优化
问题描述
对于我拥有的代码,我可以有选择地强制执行很多__attribute__
令人惊奇的事情。但是,我想有选择地更改我无权访问的功能。我试图将它放入这样的包装器中,天真地希望它会“继承”它并做我想做的事情(当然它没有这样做,因为代码的编译顺序与调用顺序不同):
std::atomic_int32_t safeValue;
__attribute((optimize("-O3"),always_inline))
inline void setAtomic() {
safeValue = 10;
}
当使用 -O0 编译时,它仍然会导致跳转到具有大量开销的通用实现。在我的目标平台(RISC-V)中,有原子指令,而且速度非常快。只是我想在执行 -O0 构建时调试我的应用程序,但不必浪费每个原子操作的性能,因为我将调试应用程序本身,而不是在工具链中正确实现原子操作时。
开销不小: https ://godbolt.org/z/aqWKrbT8v
当我启用 -O1 时,它变得好多了: https ://godbolt.org/z/naf7Y6dqo
只是我想成为我的 O0 构建,以便在我执行原子功能时接近 O1。我知道我要问的很奇怪,但是 C++ 具有像朋友这样的功能,所以影响超出我们控制/范围的东西的想法并不完全与标准格格不入。在这种情况下,我想调整操作数 = 重载的优化方式,而无需访问代码。
我拼命尝试推送设置然后弹出它们:https ://godbolt.org/z/qajWos6v7
但这当然不起作用(因为这些东西的编译顺序与它们被调用的顺序不同)
所以我想知道是否有一些解决方案,或者一些肮脏的(但不是太极端)的解决方法,或者答案是否定的。从技术上讲,我可以访问 STD,我可以在那里更改它,过去我用各种 gcc/gdb 调整重新编译了工具链,但感觉不对。
我没有尝试的一个想法是拥有子原子实现,它将继承原子,并用我的函数覆盖运算符重载。不确定这是否是一种方法,或者我的想法完全错误。
与此同时,我的解决方案是拥有自己的原子函数实现,其中我的 C 函数(甚至不是 C++)与手工程序集内联(连同正确的破坏者https://gcc.gnu.org/onlinedocs/gcc/Using -Assembly-Language-with-C.html效果很好)。只是当 std 已经内置了一些东西时,重新实现功能感觉不对,只是我没有像我想要的那样调整它的控制权。
解决方案
相关定义可能在#include <atomic>
. 您需要将其放在源文件的顶部,由
#pragma GCC push_options
#pragma GCC optimize ("O3")
#include <atomic>
#pragma GCC pop_options
(https://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html)
当然,这根本不是“选择性的”,正如您的标题所要求的那样,但它很容易测试并且更有可能解决您的实际问题。
推荐阅读
- haskell - AWS CloudWatch 的正确格式
- node.js - 你如何用 jest 测试返回 gaurd 的备用分支?
- python - 如何解决 Mac 中的“No module named 'telepot”'错误
- java - 在 java hibernate 中你可以有一个不是实体的模型吗?
- python - 我怎样才能恢复对公会的更改 | 不和谐.py
- c++ - 我对 Visual Studio 的内存管理和内存窗口有疑问
- microsoft-graph-api - 当电子邮件存储在多个列中时查询以通过电子邮件获取用户
- c# - Blazor wasm - 在哪里检查用户权限
- angular - Angular 8 应用程序通过 https 访问本地主机上的代理 Spring Boot 应用程序
- python - 如何打印接下来的几行