gpt4 book ai didi

c++ - 如果我提前将参数声明为变量而不是将它们写入函数调用的行中,这(在内存方面)有什么区别?

转载 作者:行者123 更新时间:2023-11-28 01:32:46 26 4
gpt4 key购买 nike

例如,对于虚拟函数write(int length, const char* text){...},这两种方法在内存方面有什么不同吗?

write(18,"The cake is a lie.");

int len = 18;
char txt[19] = "The cake is a lie.";
write(len,txt)

奖励:如果出现重复怎么办?即,循环使用其元素为预期参数的数组重复调用函数。

我问这个问题,特别是奖金,希望更好地了解每个人如何消耗内存以优化我在像 Arduino 这样的内存敏感平台上编写时的效率。也就是说,如果您知道更有效的方法,请分享!谢谢!

最佳答案

这取决于char txt[19]是否声明在scope中函数的或全局(或 namespace )范围内的。

如果在一个函数的范围内,那么 txt 将被分配到堆栈上,并在运行时从驻留在 (read-仅)数据段。

如果在全局范围内,那么它将在构建时分配到数据段中。

好处:如果它分配在某个子范围内,比如循环体,那么您应该假设它会在每次循环迭代期间被初始化(优化器可能会做一些技巧,但不要指望它)。

示例 1:

int len = 18;
char txt[19] = "The cake is a lie.";
int main() {
write(len,txt);
}

此处len(一个int)和txt(19字节+对齐填充)将在构建时分配到程序的数据段中.

示例 2:

int main() {
int len = 18;
char txt[19] = "The cake is a lie.";
write(len,txt);
}

此处的字符串文字 "The cake is a lie." 将在构建时分配到程序的数据段中。此外,lentxt(19 字节 + 填充)可能会在运行时分配到堆栈上。优化器可能会忽略 len 分配,甚至可能会忽略 txt,但不要指望它,因为它取决于许多因素,例如 write 主体可用,它究竟做了什么,优化器的质量等。如有疑问,查看生成的代码(godbolt 现在支持 AVR 目标)。

示例 3:

int main() {
write(18,"The cake is a lie.");
}

此处的字符串文字 "The cake is a lie." 将在构建时分配到程序的数据段中。 18 将嵌入到程序代码中。


由于您是在 AVR 上进行开发,因此有一些额外的细节值得一提,即应用程序的可执行文件最初存储在 Flash 中,一旦你“运行”它,它就会被复制到 RAM 中。使用 PROGMEM 可以避免复制到 RAM 并将数据保存在闪存中关键字(尽管要对数据执行任何有意义的操作,您需要将其复制到 RAM)。

关于c++ - 如果我提前将参数声明为变量而不是将它们写入函数调用的行中,这(在内存方面)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50787947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com