没有 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 上的内联空函数。他们不使用共享库中的符号。
在嵌入式软件的上下文中,我想制作一个类似于 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 上的内联空函数。他们不使用共享库中的符号。