【发布时间】:2018-07-13 12:37:54
【问题描述】:
这是一个仅供兴趣的实验......
我正在尝试制作一个容器,该容器在一个连续的内存块中保存固定数量的字节(例如标头)和动态数据块(例如主体)。在传统的 C 编程中,我会将 char[0] 作为最后一个实例变量,我会过度分配 sizeof(struct) + data_length。
这适用于 C++,但我想要更好的东西。所以我的问题是std::array 是以指针开头还是可以像原生 C 样式数组一样使用?
这是一些示例代码...
struct pkg_base
{
virtual std::size_t get_body_size() = 0;
virtual void *get_body_ptr() = 0;
};
template<typename _T, std::size_t _N>
struct pkg
: public pkg_base
{
std::uint16_t a;
std::uint16_t b;
std::uint16_t c;
std::array<_T, _N> body{};
std::size_t get_body_size() override
{
return ( body.size() );
}
virtual void *get_body_ptr() override
{
return ( body.data() );
}
};
void _test_package()
{
auto vec = std::vector<std::unique_ptr<pkg_base>>{};
vec.push_back(std::make_unique<pkg<char, 1024>>());
vec.push_back(std::make_unique<pkg<float, 1024>>());
vec.push_back( std::make_unique<pkg<std::string, 1024>>() );
auto const size = vec.front()->get_body_size();
auto const *ptr = static_cast<char *>( vec.front()->get_body_ptr() );
}
【问题讨论】:
-
std::array“以指针开头”是什么意思? -
“这适用于 C++” - 不,它不支持标准 C++ 不允许零大小的数组。
-
我不会将
std::array定义为“动态数据块”... -
placement new 是拥有“可变大小类”的方式。
-
@oneiros 据我所知,您已将我数字中的撇号删掉,这是为什么呢?这是有效的代码。