gpt4 book ai didi

c - 如何获取函数返回值的指针?

转载 作者:行者123 更新时间:2023-12-04 11:55:35 25 4
gpt4 key购买 nike

功能

我正在使用函数 uint32_t htonl(uint32_t hoSTLong) 将 uint32_t 转换为网络字节顺序。

我想做的事

将变量转换为网络字节顺序后,我需要对变量进行计算:

//Usually I do calculate with much more variables and copy them into a much
// larger buff - to keep it understandable and simple I broke it down
// to one calculation

uint32_t var = 1;
void* buff;

buff = malloc(sizeof(uint32_t));

while(var < 5) {
var = htonl(var);
memcpy(buff, &var, sizeof(uint32_t));
doSomethingWithBuff(buff);
var++; // FAIL
}

我能做什么,但...

其实我已经找到了解决这个问题的方法:
uint32_t var = 1, nbo;
void* buff;

buff = malloc(sizeof(uint32_t));

while(var < 5) {
nbo = htonl(var);
memcpy(buff, &nbo, sizeof(uint32_t));
doSomethingWithBuff(buff);
var++;
}

问题是我用这个解决方案浪费了内存,因为 nbo 只是用作缓冲区。

我更愿意做什么

如果我可以在 memcpy() 函数中使用 htonl() 函数就完美了。
memcpy() 需要第二个值为 void*。我的问题是:如何获取 htonl() 返回值的地址?
uint32_t var = 1;
void* buff;

buff = malloc(sizeof(uint32_t));

while(var < 5) {
memcpy(buff, (GET ADDRESS)htonl(var), sizeof(uint32_t));
doSomethingWithBuff(buff);
var++;
}

如果这是不可能的,因为“没有这个变量的地址”:返回变量而不是指向变量的指针的函数如何工作?

最佳答案

关于只有一个可变缓冲区的讨论

我认为你在做错误的微优化。

Uchia Itachi 指出,获取返回值的地址将是一个错误。

实际上,如果您关心效率,则瓶颈是静态存储。 malloc() 有内存开销——除了您存储在静态内存中的数据之外,还有写入的元数据。例如 here (scroll down to Implementation Details)解释了一个聪明的最小算法如何对每个分配只有 size_t 的开销。这甚至没有考虑碎片化。

memcpy() 是一个快速函数,但对于单个数字也是一种矫枉过正。

因此,我建议只使用堆栈。使 buff 成为全局整数变量。然后将 buff,s 地址传递给那些需要缓冲区的地址。他们不会注意到差异。

关于修改后的问题的讨论 - 循环中具有大量写入和读取的大缓冲区

当函数返回(某事)时,它会将值(或指向对象的指针)压入寄存器或堆栈。另一方面,当一个变量被声明、初始化和使用时,它要么驻留在寄存器中,要么驻留在堆栈中。

你注意到相似之处了吗?优化编译器会删除不需要的变量,还会创建未命名的变量供内部使用。例如,在检测到变量在此范围内不再被引用后,重新使用该变量的存储。

因此,应该努力编写简单易读的代码,并将细节留给编译器。这意味着您的第二个示例非常好。

关于c - 如何获取函数返回值的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287179/

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