缓冲区大小在C/ c++中的最佳实践
Size of buffer best practice in C/C++
不将缓冲区的大小定义为宏或常量是否被认为是不好的做法?
例如:<>之前字符缓冲区[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是处理读取配置文件的类的对象。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 别名模板的专业化 C++11 中没有开销的最佳替代方案