将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?

Is it undefined behaviour to std::memcpy a struct into a std::vector<char> that has enough capacity?

本文关键字:std 未定义 lt char gt 容量 转换 memcpy 结构 vector      更新时间:2023-10-16

以下程序会给出未定义的行为吗?

#include <vector>
#include <cstring>
struct Data
{
float   a;
float   b;
int     z;
};
int main()
{
std::vector<char> allMyData;
Data someStuff({.2f,.3f,1});
allMyData.resize(sizeof(Data));
std::memcpy(&allMyData[0], &someStuff, sizeof(Data));
return 0;
}

在您显示的特定示例中没有未定义的行为。 但是,如果Data包含指向外部数据的指针,或非 POD 类类型(如标准容器等(,情况将大不相同。

vector 的capacity和它的size是有区别的,以这段代码为例:

auto vector = std::vector<float>();
auto array = std::array<float, 4096>();
array.fill(0.5f);
vector.resize(4096);
std::copy(array.begin(), array.end(), vector.data());

在这里复制这样的array内容是完全可以的vector因为 的大小是 4096 个元素 - 与数组相同。但是,一旦您执行此操作:

auto vector = std::vector<float>();
auto array = std::array<float, 4096>();
array.fill(0.5f);
vector.reserve(4096);
std::copy(array.begin(), array.end(), vector.data());

你会遇到很多麻烦,因为即使你array复制到一个缓冲区中,从技术上讲,缓冲区可以容纳所有元素,vector也不会改变其size所以vector.empty()会返回 true,并且尝试访问它的任何元素充其量只会抛出调试异常。

相关文章: