我在网上搜索了存储在内存中的C宏,它与功能相比如何消耗更多的内存?无法得到任何令人满意的答案。任何人都可以让我知道asnwer究竟是什么?
有没有办法找出c中宏所消耗的内存?
我想到的另一个问题是,假设我对一个宏#define START 10进行十分转换,并且我有变量int i = 0,我将用宏取代i = START。现在int i = 0已经在堆栈中分配了内存,如果我将START置于0,那么它将只是先前分配的内存中的一个重新安排。所以请告诉我在这种情况下它将如何消耗更多的内存。我不确定我的想法是否正确,如果我错了,请纠正我。
本网站上提出的上一个问题并没有回答这些情况。
谢谢
答案 0 :(得分:4)
宏是预处理器构造。在编译器甚至看到代码之前,所有的宏都被替换。
这意味着如果您使用大量具有大量替换的宏,它们将生成大量代码。函数调用不起作用,因为它们调用的单个函数只有代码一次。
没有标准的方法来确定宏的代码是多少,没有。
答案 1 :(得分:2)
宏不存储在最终程序中的任何位置的内存中,而是宏的代码每当发生时都会重复。就实际的编译器而言,它们甚至不存在,它们在它们到达目前之前已被预处理器取代。
这通常占用更多内存的原因是每次使用宏时它都会重复出现。没有通用的方法可以确定他们将占用多少内存,但老实说,内存考虑因素并不是理由更喜欢函数到宏的原因。
如果您需要查找消耗的内存量,可以通过查看使用宏的地方的反汇编并将宏在源代码中出现的次数乘以生产的拆卸线数。但是,不能保证在不同情况下对宏的不同使用或相同的使用会产生相同的代码,因此这只能是粗略的措施。
答案 2 :(得分:1)
程序执行期间,C宏的值不会存储在内存中。相反,它们的值会被复制到编译期间使用的任何位置。
答案 3 :(得分:0)
“这通常占用更多内存的原因是它得到了 每次使用宏时都会重复。“
使用现代编译器取决于编译设置(快速代码/小代码),它可以发现常用代码并将其优化为函数(SMALL),或者可以内联代码以获得速度(FAST)。
并不总是代码总是更大的情况取决于优化器的好坏程度以及您使用的编译器设置。
当然,您总是可以使用调用函数的宏而不是包含大型内联代码段。这完全取决于你的选择。