缓冲区大小在C/ c++中的最佳实践

Size of buffer best practice in C/C++

本文关键字:最佳 c++ 缓冲区      更新时间:2023-10-16

不将缓冲区的大小定义为宏或常量是否被认为是不好的做法?

例如:

<>之前字符缓冲区[1024];之前

代替:<>之前#define BUFF_SIZE 1024字符缓冲区(BUFF_SIZE);

一般来说,由于以下几个原因,"幻数"被认为是一种不好的做法。
1)如果你用有意义的名字命名常量,它就会变成自文档,从而提高代码的可读性。
2)常量通常不是在一个地方使用。考虑这样一种情况:您定义了一个包含1024个元素的缓冲区,然后,在代码的其他地方,您希望循环遍历它的所有元素(假设sizeof在那里不可用,例如,在某些地方它被转换为指针)。你会写成for (i=0; i<1024...。但是明天你会觉得1024不够大,你想让它变成不同的数字。然后,您将不得不寻找所有有这个数字的地方,但只在与缓冲区大小相关的地方。通过命名常量,您可以避免所有这些麻烦,只需在一个地方更改值。从而提高代码的可维护性

老实说,两者都不是最佳实践。在C++中,建议您像这样使用const变量:

const int BUFF_SIZE = 1024;
char buffer[BUFF_SIZE];

这样你就可以把它们隐藏在命名空间或者放在

完全一样。在编译你的代码为C/c++代码之前,编译器会将BUFF_SIZE替换为1024

此外,定义总是超出名称空间。那么,最好定义一个常量变量。

如果文档说明您将存储的文本永远不会超过设定的数量,那么在编译时如何定义缓冲区只是一个品味问题。

但是,如果缓冲区将包含文本,并且可以在运行时通知文本的大小,那么不要使用常量——使用运行时返回给您的信息来适当地调整缓冲区的大小。

例如,许多处理文件、套接字等的I/O函数会提供有关读取字符数的信息。另一个例子是,许多用于各种技术的API函数在两种模式下工作,其中第一种模式允许您查询存储信息所需的字符数,而第二种模式是实际获取字符。

c++的"最佳"方法是使用std::vector<char>并在适当的时间调用resize()。这不仅使您的程序安全,而且灵活。我个人不得不调试从API函数返回的信息超出硬编码缓冲区边界的问题,从而导致悲伤。使用std::vector可以缓解这个问题。

依我之见,最佳实践是将包含常量的数据与代码分开。在配置文件中使用这些常量可以很好地分隔它们。然后,您可以使用libconfig之类的库读取配置文件一次,并在代码中设置值。像这样:

const int bufferSize = cfg.getBufferSize();
char buffer[bufferSize];

cfg是处理读取配置文件的类的对象。