gpt4 book ai didi

c - 用于格式化字符串的 alloca 与固定缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 06:30:13 25 4
gpt4 key购买 nike

我需要在函数中记录一些消息,例如:

void log(char* format, ...);

对于格式缓冲区有几种方法:

有一个固定大小的缓冲区。这不会导致溢出,但可能会截断消息。

void log1(char* format, ...)
{
char buffer[BUFFER_SIZE];

va_list args;
va_start(args, format);
vsnprintf(buffer, BUFFER_SIZE, format, args);
va_end(args);
}

有一个可变长度的缓冲区。在堆栈上分配内存时,这可能会导致溢出。我不会考虑在堆上分配内存的情况。这是一个设计限制。

void log2(char* format, ...)
{
va_list args;
va_start(args, format);
int length = vsnprintf(NULL, 0, format, args);
char* buffer = (char*)alloca(length + 1);
vsnprintf(buffer, length+1, format, args);
va_end(args);
}

该函数将从多个线程调用,因此保持公共(public)全局缓冲区不是一个选项(太多锁定)。由于一些旧的编译器/可执行格式限制,TLS 也不是一个选项。

我应该选择哪个版本?使用第一种或第二种方法还有其他明显的优点/缺点吗?

最佳答案

按照措辞,您应该选择截断消息的变体,因为它是您呈现的唯一以定义的方式执行的选项。

关于c - 用于格式化字符串的 alloca 与固定缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605706/

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