完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[C] 纯文本查看 复制代码
#defineCMD_PARCMD_INPUT"OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R"(1) #defineNUM_PARCMD_INPUTsizeof(CMD_PARCMD_INPUT)-1(2) #defineNUM_PARCMD_INPUTstrlen(CMD_PARCMD_INPUT) 问题: 涉及运行效率问题 , 上面 1 和 2 两个 宏定义 , 编译器都会像常数 那样 直接优化吗? 还是在每次调用的时候运行一遍? [这个自己没试 , 先问问大神] |
|
相关推荐
8个回答
|
|
#define NUM_PARCMD_INPUT strlen(CMD_PARCMD_INPUT)
strlen是函数,在编译时不会被优化,执行NUM_PARCMD_INPUT仍会产生调用strlen函数的开销。 #define NUM_PARCMD_INPUT sizeof(CMD_PARCMD_INPUT)-1 sizeof是标识字,不是函数,标识字与常量会被编译器优化。 对于标识字、常量,编译器在编译时就知道他是什么,所以能提前优化; 而函数只是一个“地址”,需要CPU运行时才知道执行什么指令,所以编译器编译时无法提前优化。 |
|
|
|
宏定义在编译前就会被全部替换吧,宏替换只会占用预编译时间不会增加程序运行时间。
所以程序运行时应该是直接运行 sizeof(“OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R”)-1 和 strlen(“OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R”) 。 这2个函数应该不会被编译器优化吧。 |
|
|
|
我可能问的有问题。
就这个例子来说, 宏替换后, 对比 直接定义固定的数值,如 #define NUM_PARCMD_INPUT 40 会不会增加 时间或空间上的开销 是 直接定义 更有效率?还是一样? |
|
|
|
应该是直接定义常数(固定值)节省时间和空间。
|
|
|
|
编译器 定义
#define N 100 和 #define N 1*2*5*10 是没有区别的, 直接替换为 100了 可是 用到 sizeof 和 strlen 应该就不一定了 我自己的认为是 sizeof 本身 也是一个宏, 应该跟上面一样直接替换成一个固定值 ,效率不变 而 strlen 是个函数, 所以 替换后 , 应该还是有 函数的调用开销 等 但是 我自己 不确认这个答案 是不是对的 |
|
|
|
可以查看下汇编代码,呵呵
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4383 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
247浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
209浏览 2评论
228浏览 2评论
220浏览 2评论
264浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-27 06:40 , Processed in 0.917837 second(s), Total 90, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号