没有 C++ 标准库的 C++ 容器

C++ container without C++ standard lib

在嵌入式软件的上下文中,我想制作一个类似于 std::vector 的容器。 Vector既有大小也有容量,这意味着vector分配了capacity*sizeof(T)个字节,但只构建了size个条目。 一个例子

vector<string> v;
v.reserve(100)
v.resize(10)

v[9] 给出了有效的字符串,但是 v[10] 给出了未初始化数据的有效分配内存部分,因此任何 string 方法都将具有未定义的行为,例如 v[10]= string(), 如果 string& operator(const string& rhs) 试图摧毁 *this.

如何在不包含 <new> 或任何其他 C++ 标准包含文件的情况下仅使用 C++ 编译器在给定内存地址中构建对象?

更新 我可以编写放置新运算符的自定义实现并使最终可执行文件独立于 libstdc++.so 吗? 我也不希望针对 libstdc++.a 进行静态链接。

How can I build an object in a given memory address just using C++ compiler without including or any other C++ standard include files?

您必须阅读您的编译器文档 and/or 源代码和相关库,并找出该特定编译器所需的内容以及您使用的特定选项,以允许具有该特定配置的该特定编译器使用放置新的。 IE。如果您不能使用头文件等可移植性功能,则必须为编译器提供您自己的 non-portable 头文件替换。

例如,对于 gcc x86_64:

inline void* operator new(unsigned long, void* __p) { return __p; }
inline void operator delete(void*, void*) { }

struct A {};
int main() {
    alignas(A) char buf[sizeof(A)];
    struct A *a = new (buf) A;
    a->~A();
    ::operator delete(buf, a);
}

make final executable independant from libstdc++.so?

以同样的方式,针对 LLVM libc++ 进行编译使可执行文件独立于 GNU libstdc++。在 libstdc++ 和 link 中提供您自己所需函数的实现。

Placement new 是 gcc 上的内联空函数。他们不使用共享库中的符号。