c++ - 静态数组缓冲区分配

标签 c++ arrays buffer

假设我定义了一个数组 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/

相关文章:

javascript - JSON 编码 MySQL 数组并在 Google map 上显示

c# - 在两个数组中查找 "not the same"个元素

arrays - 如何最有效地在 L,R 范围内的数组中找到最频繁的数字及其频率?

在 C 中的缓冲区中调用程序集

c++ - 无法从 'SDL_Surface' 转换为 'SDL_Surface MainMenu::*'

c++ - 方法的签名必须是什么才能与 glutDisplayFunc() 一起使用?

c++ - Qt Creator + OpenCV : Program runs from . exe 但不是来自编辑器

c++ - 函数 bool isnan( … ) 在 C++ 中的定点实现

performance - 是什么让 node.js SlowBuffers "slow"?

c - 获取缓冲区末尾的地址而不是其开头的地址