综合技术
直播中

晏玉屏

7年用户 189经验值
私信 关注
[问答]

请问编辑器会像常数那样直接优化宏定义吗?

[C] 纯文本查看 复制代码
#defineCMD_PARCMD_INPUT"OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R"(1)    #defineNUM_PARCMD_INPUTsizeof(CMD_PARCMD_INPUT)-1(2)    #defineNUM_PARCMD_INPUTstrlen(CMD_PARCMD_INPUT)
问题:
涉及运行效率问题 , 上面 1 和 2 两个 宏定义 , 编译器都会像常数 那样 直接优化吗? 还是在每次调用的时候运行一遍?
[这个自己没试 , 先问问大神]

回帖(8)

龙旭

2019-10-30 08:16:37
#define  NUM_PARCMD_INPUT    strlen(CMD_PARCMD_INPUT)
strlen是函数,在编译时不会被优化,执行NUM_PARCMD_INPUT仍会产生调用strlen函数的开销。
#define  NUM_PARCMD_INPUT    sizeof(CMD_PARCMD_INPUT)-1
sizeof是标识字,不是函数,标识字与常量会被编译器优化。
对于标识字、常量,编译器在编译时就知道他是什么,所以能提前优化;
而函数只是一个“地址”,需要CPU运行时才知道执行什么指令,所以编译器编译时无法提前优化。
举报

吴南加

2019-10-30 08:29:14
宏定义在编译前就会被全部替换吧,宏替换只会占用预编译时间不会增加程序运行时间。
所以程序运行时应该是直接运行 sizeof(“OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R”)-1   
和 strlen(“OA0M200V400IP300OM200P1700M3000IM200D800M2000OD1200R”)  。
这2个函数应该不会被编译器优化吧。
举报

韩宁

2019-10-30 08:47:42
我可能问的有问题。
就这个例子来说, 宏替换后,
对比 直接定义固定的数值,如 #define NUM_PARCMD_INPUT 40
会不会增加 时间或空间上的开销
是 直接定义  更有效率?还是一样?
举报

张倩

2019-10-30 08:54:35
应该是直接定义常数(固定值)节省时间和空间。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分