【问题标题】:GCC __attribute__((always_inline)) and lambdas, is this syntax correct?GCC __attribute__((always_inline)) 和 lambdas,这种语法正确吗?
【发布时间】:2013-06-26 05:59:01
【问题描述】:

我使用 GCC 4.6 作为 Cortex 嵌入式处理器的 lpcxpresso ide 的一部分。我的代码大小非常有限,尤其是在调试模式下编译时。到目前为止,使用 attribute((always_inline)) 已被证明是内联琐碎函数的好工具,这可以在调试模式下节省大量代码膨胀,同时仍保持可读性。我希望它在未来会成为主流并得到支持,因为这里提到了http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348c/CIAJGAIH.html

现在我的问题是:这是声明 Lambda 始终内联的正确语法吗?

#define ALWAYS_INLINE __attribute__((always_inline))
[](volatile int &i)ALWAYS_INLINE{i++;}

它确实有效,我的问题是它将来会继续有效吗?我能做些什么来确保它在未来有效。如果我切换到另一个支持 c++11 的主要编译器,我会找到一个类似的关键字来替换 attribute((always_inline)) 吗? 如果我要见到我的仙女教母,我希望有一个编译器指令,它会导致所有 lambdas 被构造为具有空构造函数的临时变量并通过引用绑定,即使在调试模式下也会自动内联。有什么想法吗?

【问题讨论】:

  • C++11 语法为[[always_inline]]。但是 GCC 似乎还没有使用兼容的语法。讨论 C++11 之前的 GCC 属性在 C++11 lambda 上的位置可能价值有限。
  • 所以你的意思是将来会有一个兼容的语法。这意味着将来将我的代码移植到 c++ 编译器 X 只需要我更改 #define 的内容?
  • @MSalters 在标准 C++ 中没有这样的属性。此类功能的标准 C++11 语法中的 GCC 特定属性是 [[gnu::always_inline]]
  • @Ruslan:这就是为什么我说语法应该是 [[always-inline]]。这是明确的假设。 IIRC,GCC 4.6 也没有 [[gnu::always-inline]] 语法。

标签: gcc c++11 lambda inline


【解决方案1】:

以后还会继续使用吗?

always_inline 可能是特定于编译器的,并且由于没有标准指定其与 lambda 的确切行为,因此无法保证这将在未来继续有效。

我可以做些什么来确保它有效?

这取决于编译器而不是你。如果未来的版本不再支持带有 lambda 的 always_inline,您必须坚持使用可以工作的版本,或者编写您自己的预处理器,使用类似 always_inline 的关键字内联 lambda。

如果我切换到另一个支持 c++11 的主要编译器,我会 找到类似的关键字?

很可能,但同样,没有保证。唯一真正的标准是 C++ inline 关键字,它不适用于 lambda。对于非 lambda,它只建议内联并告诉编译器一个函数可以在不同的编译单元中定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2010-11-21
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多