关于__attribute__( ( always_inline ) ) __STATIC_INLINE定义内联函数的一些问题

在从GCC移植到ARMCC编译器的过程中,遇到内联函数的问题。原函数使用__STATIC_INLINE修饰,但编译器未进行内联。添加__attribute__((always_inline))后,内联生效。即使不加__STATIC_INLINE,仅保留__attribute__((always_inline))也能实现内联。文章提出了三个疑问:1)为何ARMCC能识别__attribute__((always_inline));2)去除__attribute__((always_inline))后为何不再内联;3)为何不加__STATIC_INLINE也可内联,并寻求解答。
摘要由CSDN通过智能技术生成

最近移植软件,原编译器是GCC,移植到STM32上用ARMCC。

有几个库函数(htonl,ntohl,htons,ntohs)在标准库里没有,需要自己写。于是网上找了个模板比较简单,修改了下做成自己的函数。

然后想做成内联函数,于是加了__STATIC_INLINE(定义在core_cm4.h中)修饰。以htons为例,程序如下:

// 模拟htons函数,本机字节序转网络字节序
__STATIC_INLINE unsigned short int htons(unsigned short int h)
{
	// 若本机为大端,与网络字节序同,直接返回
	// 若本机为小端,转换成大端再返回
	int i = 0x12345678;
	return (*((unsigned char *)(&i)) == 0x12) ? h : BigLittleSwap16(h);

}

结果检查汇编码发现编译器并没有选择内联,仍然是普通的函数调用,如下图:

于是在__STATIC_INLINE前面加了__attribute__( ( always_inline ) )修饰,以htons为例,程序如下:

// 模拟htons函数,本机字节序转网络字节序
__attribute
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值