首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

与‘# __attribute__’相比,'inline define ((forced_inline))‘的缺点是什么?

与‘# attribute’相比,'inline define ((forced_inline))‘的缺点是什么?

'inline define ((forced_inline))'是一种宏定义,用于在编译时将函数体直接插入到调用处,以提高程序的执行效率。与‘# attribute’相比,'inline define ((forced_inline))'的缺点主要体现在以下几个方面:

  1. 可读性差:由于宏定义是在预处理阶段进行替换,因此在代码中使用'inline define ((forced_inline))'会导致代码的可读性变差。宏定义的替换过程不会被编译器显示,使得代码的逻辑难以理解和调试。
  2. 宏定义的副作用:宏定义是简单的文本替换,没有类型检查和作用域限制。这可能导致一些意外的副作用,例如参数多次计算、变量重复定义等问题,增加了代码的错误风险。
  3. 编译时间增加:由于宏定义是在预处理阶段进行替换,每次调用都需要进行文本替换,这会增加编译时间。特别是在大型项目中,使用大量的宏定义可能导致编译时间显著增加。
  4. 代码膨胀:宏定义会将函数体直接插入到调用处,这可能导致代码膨胀。如果宏定义的函数体较大或在多个地方被调用,会导致生成的目标代码体积增大,影响程序的运行效率。
  5. 难以调试:由于宏定义在预处理阶段进行替换,调试时无法直接查看宏定义的具体执行过程和参数值。这给调试带来了一定的困难,增加了调试的复杂性。

综上所述,与‘# attribute’相比,'inline define ((forced_inline))'的缺点主要包括可读性差、宏定义的副作用、编译时间增加、代码膨胀和难以调试等方面。在实际开发中,需要权衡使用宏定义的效率提升和代码可维护性之间的关系,选择合适的方式来优化代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mongodbmysql相比缺点

关系型数据库相比,MongoDB优点: ①弱一致性(最终一致),更能保证用户访问速度: 举例来说,在 传统关系型数据库中,一个COUNT类型操作会锁定数据集,这样可以保证得到“当前”情况下精确值...②文档结构存储方式,能够更便捷获取数据。 对于一个层级式数据结构来说,如果要将这样数据使用扁平式,表状结构来保存数据,这无论是在查询还是获取数据时都十分困难。...(这是与其他NoSQL相比,MongoDB也具有的优势) 现在网络上很多NoSQL开源数据库完全属于社区型,没有官方支持,给使用者带来了很大风险。...关系型数据库相比,MongoDB缺点: ①mongodb不支持事务操作。 所以事务要求严格系统(如果银行系统)肯定不能用它。(这点和优点①是对应) ②mongodb占用空间过大。...一种减少空间占用方法是把字段名尽量取短一些,这样占用空间就小了,但这就 要求在易读性空间占用上作为权衡了。

15.8K60
  • iOS_ __attribute__

    ) alias:设置别名 unused、used:(见下文) noinline、always_inline:(见下文) nonnull:(见下文) deprecated、constructor...必须配合 alias使用(即必须是 static 定义): __attribute__((weakref, alias("target"))) noinline、always_inline noinline...."); }; 该 block 没有被显示调用,但会在其 dealloc 前调用(即 被销毁前) Reactive Cocoa 中 @onExit 实现就是如此: #define onExit\...); } visibility visibility 类型有 4 种: default:默认可见性对象函数可以直接在其他模块中引用,包括在动态链接库中 ,它属于一个正常,完整外部连接。...//系统宏,可以直接拿来用 #define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)) #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE

    26630

    ESP8266无人机-初始化过程

    下面是: ESPCOPTER esp; 引入是这个头 这些都是各种输出控制功能 如果崽深入,其实会知道到底是什么功能。 其实我这里想讲一下arduino.h这个神奇头文件。...私有的类先说明SDA,SCL等一开电平 这是模拟时序信号 #define GPEC ESP8266_REG(0x314) // GPIO_ENABLE_CLR WO #define ESP8266..._REG(addr) *((volatile uint32_t *)(0x60000000 + (addr)) 强制内联展开 在ARM系统下,可以给函数增加__attribute__((always_inline...static inline __attribute__((always_inline)) void f() 慎用 inline 内联能提高函数执行效率,为什么不把所有的函数都定义成内联函数?...内联是以代码膨胀(复制)为代价,仅仅省去了函数调用开销,从而提高函数执行效率。 如果执行函数体内代码时间,相比于函数调用开销较大,那么效率收获会很少。

    83210

    C代码 从源代码到可执行文件——编译全过程解析

    程序生命周期从一个高级C语言程序开始,这种形式能够被人读懂,却不能被机器读懂,为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序格式打包并以二进制磁盘文件形式存储起来...预处理 预处理器(CPP)根据源程序中以字符”#”开头命令,修改源程序,得到另一个源程序,常以.i作为文件扩展名。修改主要包括#include、#define和条件编译三个方面。...mingw_get_output_format (); } extern __inline__ __attribute__((__always_inline__)) unsigned int __attribute...1 : __mingw_get_printf_count_output (); } extern __inline__ __attribute__((__always_inline__)) int _...编译 编译器(CCL)将经过预处理器处理得到文本文件hello.i和main.i翻译成hello.smain.s,其中包含了汇编语言程序,汇编语言程序以一种标准文本格式确切描述一条低级机器语言指令

    2.1K50

    iOS底层—OC对象本质isa

    结构体(struct)特点总结如下: 优点:共存,有容乃⼤,全⾯; 缺点:struct内存空间分配是粗放,不管⽤不⽤,全分配。 3.联合体特点 同样引入一个案例,来区分结构体和联合体区别!...同时,运行代码,给联合体赋值过程中,联合体中各个属性之间处于互斥状态,并且联合体实际大小最大属性值大小相等。...联合体(union)特点总结如下: 优点:内存使⽤更为精细灵活,也节省了内存空间; 缺点:不够包容,各变量是互斥。...四.isa探索 1.isa_t联合体 通过上面的案例,认识到了联合体结构体区别,同时了解到位域在节省内存方面的优势。而isa,就是采用联合体结合位域,对数据进行了封装。...ISA_MASK是什么呢?

    54810

    redis学习 - sds字符串

    redis学习 - sds字符串 Redis 设计实现:如果想要知道redis底层,这本书可以给予不少帮助,非常推荐每一位学习redis同学去翻一翻。...使用空间预分配和惰性空间释放,其实就是在扩容时候,根据大小额外扩容2倍或者1M空间,方面字符串修改时候进行伸缩 使用二进制保护,数据读写不受特殊限制,写入时候什么样读取就是什么样 支持兼容部分...#define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #define SDS_TYPE_16 2 #define SDS_TYPE_32 3 #define SDS_TYPE...SDS_HDR_VAR函数则通过结构体类型字符串开始字节,获取到动态字符串头部开始位置,并赋值给sh指针。SDS_HDR函数则通过类型字符串开始字节,返回动态字符串头部指针。...这里值得注意是:string_size < 1ll<<32这段代码在redis3.2中才进行了bug修复,在早期版本当中这里存在分配类型Bug commit static inline char sdsReqType

    30910

    iOS小技能:适配安全区域距离(safeAreaInsets)

    方式编译函数,防止静态分析 使用inline方式将函数在调用处强制展开,防止被hook和追踪符号。...static __attribute__((always_inline)) void anti_debug() //一般函数调用都会通过call方式来调用,hacker很容易对一个函数做手脚,如果是以...inline方式编译,会把该函数code拷贝到每次调用该函数地方;而static会让生成二进制文件中没有清晰符号表,让逆向的人很难弄清楚代码逻辑 查看汇编文件:选中xx.m文件-->Xcode...菜单 --> Product --> Perform Action --> Assemble "xx.m" #define区别: 使用#define宏定义代码,编译器不会对其进行参数有效性检查...#define宏定义代码,其返回值不能被强制转换成可转换适合类型。

    4.2K30
    领券