STL容器中的max_size由什么决定?

我试图在 C 中重现 std::string 的行为,但是有一件事我真的不知道该怎么做。有一个max_size成员方法可以提供字符串(或向量等的任何其他数组)可以具有的最大大小,所以我的问题是我知道这个值可能取决于系统,那么容器如何确定这个数字?我可以在 C 中得到它吗?

回答

STL 容器中的 max_size 由什么决定?

标准库的实现者选择它。考虑到 API 和目标系统的限制,实现者应该设计容器以支持尽可能大的尺寸。容器的实现失败,并且提供的分配器可能会施加额外的限制,理想情况下应该通过降低的(因此更准确)来反映max_size

请注意,这max_size在实践中很少有用。这是一个理论上的上限,实际上不一定可以达到……通常是因为内存不足,至少在 64 位系统上是这样。它用于早期检测明显错误的用户输入(然后相应地抛出异常)。

我可以在 C 中得到它吗?

您可以定义一个常量 extern 变量并在 C++ 翻译单元中对其进行初始化。例子:

// common_header.h
// add header guard here
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

extern const size_t cpp_string_max_size;
extern const size_t cpp_vector_int_max_size;

#ifdef __cplusplus
}
#endif

// source.cpp
#include "common_header.h"
#include <string>
#include <cstdlib>
#include <vector>

const std::size_t cpp_string_max_size = std::string{}.max_size();
const std::size_t cpp_vector_int_max_size = std::vector<int>{}.max_size();

然后,使用 C++ 编译器编译 C++ 翻译单元并将其与 C 程序链接。


我正在寻找一种不涉及任何 C++ 的方法

根据“任何 C++”的含义,您可以使用元编程:编写一个 C++ 程序,该程序生成一个 C 源文件,其中包含由 C++ 程序生成的常量。生成部分显然涉及 C++,但生成的源代码将是纯 C 语言,并且只能使用 C 编译器进行编译。

如果这不符合您的喜好,您可以阅读您选择的 C++ 标准库的实现文件,看看它们是如何实现的max_size,然后手动编写 C 源代码。这并不涉及在任何时候编写或编译任何 C++,尽管它确实涉及阅读 C++。


以上是STL容器中的max_size由什么决定?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>