GCC __attribute __((always_inline))和lambdas,这个语法是否正确?

时间:2013-06-28 12:48:07

标签: gcc c++11 lambda inline

我正在使用GCC 4.6作为Cortex嵌入式处理器的lpcxpresso ide的一部分。我的代码大小非常有限,尤其是在调试模式下进行编译时。到目前为止,使用属性((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的另一个主要编译器,我会找到一个类似的关键字,我可以将属性((always_inline))替换为? 如果我要见到我的仙女教母,我希望有一个编译器指令,它会导致所有构造为带有空构造函数的临时对象并且通过引用绑定的lambdas即使在调试模式下也会自动内联。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

将来会继续发挥作用吗?

可能但是,always_inline是特定于编译器的,因为没有标准指定它与lambda的确切行为,所以不保证将来会继续这样做。

  

我该怎么做才能确保它有效?

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

  

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

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