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

时间:2015-06-04 20:21:05

标签: c++

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

例如:


    char buffer[1024];

而不是:


    #define BUFF_SIZE 1024

    char buffer[BUFF_SIZE];

5 个答案:

答案 0 :(得分:6)

一般来说,由于几个原因,“魔术数字”被认为是一种不好的做法 1)如果使用有意义的名称命名常量,它将变为自我记录,从而提高代码的可读性。
2)常数通常不在一个地方使用。考虑一下你用1024个元素定义一个缓冲区的情况,然后在代码的其他地方,你想要遍历它的所有元素(假设sizeof在那里不可用,例如在某些地方它被转换为a指针)。你会写for (i=0; i<1024...之类的东西。但是明天你会认为1024不够大,你想让它变得不同。然后你将不得不在拥有这个数字的所有地方之后追捕,但只有在与缓冲区大小有关的地方。通过命名常量,您可以避免所有这些麻烦,只需在一个地方更改值。从而提高了代码的可维护性

答案 1 :(得分:2)

说实话,两者都不是最佳做法。在C++中,建议您使用const变量,如下所示:

const int BUFF_SIZE = 1024;

char buffer[BUFF_SIZE];

这样您就可以将它们隐藏在名称空间中,或者将它们放在中。

答案 2 :(得分:1)

这也是一样的。在将代码编译为C / C ++代码之前,编译器将BUFF_SIZE替换为1024

此外,定义总是在命名空间之外。那么最好定义一个常量变量。

答案 3 :(得分:1)

如果记录了您将存储的文本从不超过设定的数量,那么在编译时如何定义缓冲区只是一个品味问题。< / p>

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

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

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

答案 4 :(得分:0)

恕我直言,最佳做法是将包含常量的数据与代码分开。如果在配置文件中包含常量,则可能会发生这些问题。然后,您可以使用类似libconfig的库来读取配置文件一次并在代码中设置值。像这样:

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

cfg是该类的一个对象,用于处理读取配置文件。