将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
Is it undefined behaviour to std::memcpy a struct into a std::vector<char> that has enough capacity?
以下程序会给出未定义的行为吗?
#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,并且尝试访问它的任何元素充其量只会抛出调试异常。
相关文章:
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- std::adjacent_find(last, last) 是未定义的吗?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- std::rethrow_exception(nullptr) 未定义的行为还是bad_exception?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 未定义模板"std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator&
- 递减 std::vector::begin 是否未定义,即使它从未被使用过?
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 移动 std::bitset<N> 是否超过 N 个位置未定义的行为?
- 为什么 std::memcpy(作为类型双关语的替代方案)不会导致未定义的行为?
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用
- "unix" C++预处理器宏未定义 -std=c++11
- 未定义对运算符的引用!= 使用 std::unordered_set 时
- 未定义模板'std::__1::function<int (double, double, double, double)>'的隐式实例化
- 架构x86_64的未定义符号链接constexpr std :: array