GCC __attribute__((always_inline))和lambda表达式,这个语法正确吗?

6
我正在使用GCC 4.6作为lpcxpresso ide的一部分,用于Cortex嵌入式处理器。在调试模式下编译代码时,我的代码大小非常有限。使用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))吗? 如果我能遇见我的仙女教母,我会许愿有一个编译器指令,可以使所有使用空构造函数构造并通过引用绑定的临时lambda即使在调试模式下也自动内联。有什么想法吗?


1
C++11的语法应该是[[always_inline]]。但是GCC似乎还没有使用符合标准的语法。讨论一个预C++11的GCC属性在C++11 lambda中放置的位置可能具有有限的价值。 - MSalters
所以你的意思是未来会有一种兼容的语法,这将是可移植的。这意味着将来将我的代码移植到C++编译器X只需要更改我的#define的内容? - odinthenerd
@MSalters 在标准的 C++ 中没有这样的属性。在标准的 C++11 句法中,用于该功能的是 GCC 特定的属性 [[gnu::always_inline]] - Ruslan
@Ruslan:这就是为什么我说语法将会是[[always-inline]]。它明确是假设性的。如果我没记错,GCC 4.6也没有[[gnu::always-inline]]语法。 - MSalters
1个回答

1

它在未来会继续工作吗?

可能会,但是always_inline是与编译器相关的,由于没有标准指定其与lambda的确切行为,因此不能保证这将在未来继续工作。

我该怎么做才能确保它可以正常工作?

这取决于编译器而不是您。如果将来的版本取消对带有lambda的always_inline的支持,则必须使用可用的版本或编写自己的预处理程序,以使用类似于always_inline的关键字内联lambda。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接