假设我定义了一个数组 float floatBuffer[4]
并且有一个结构:struct vec3{float x,y,z;} myVec;
在 vec3 赋值之前,我赋值:floatBuffer[3] = 0.0f;
(如果这是可能的,)我可以通过什么方式将 myVec
分配给 floatBuffer[0]
(二进制拷贝),以便
floatBuffer[0] == myVec.x
floatBuffer[1] == myVec.y
floatBuffer[2] == myVec.z
floatBuffer[3] == 0.0f
?
最佳答案
该标准确实规定,即使在标准布局结构内部(但不在开头)也可能存在填充,因此二进制拷贝可能不可移植。然而,给定一个特定的系统和打包指令(查找#pragma pack
),您可能只能使用memcpy
。
您可以尝试以下操作:
#include <cstring>
#include <algorithm>
#include <iterator>
#include <iostream>
// look up your compiler's documentation
//#pragma pack(4)
struct fs {
float x, y, z;
};
int main() {
fs b = {1.0, 2.0, 3.0};
float p[ 4 ] = {0};
static_assert( sizeof b == sizeof p - 1, "warning: padding detected!" );
std::memcpy(&p[ 0 ], &b, sizeof p - 1);
std::copy(&p[ 0 ], &p[ 0 ] + 3, std::ostream_iterator<float>(std::cout, "\n"));
}
关于c++ - 静态数组缓冲区分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402627/