【C++】字节数组的几种方式

字节缓存(一块连续内存)


用于暂存字节数据
大端字节序(Big-Endian):最高有效字节(MSB)存储在最低地址。
小端字节序(Little-Endian):最低有效字节(LSB)存储在最低地址。
数字10,大端序表示:0x0A000000,小端序表示:0x0000000A

(1)使用C风格数组

char[SIZE] buffer;
memset(buffer,0,SIZE);
int n =10;//4字节主机序存储10,二进制表示:00001010 00000000 00000000 00000000;16进制表示:0x0A 00 00 00
memcpy(buffer,&n,sizeof(n));//sizeof(n)==4
write(ofs,buffer,sizeof(n));//把buffer中二进制数据写入ofs流

(2)使用智能指针

using buf_t = std::unique_ptr<char[]>;
buf_t  uptr = make_unique<char[]>(SIZE);
auto ptr = uptr.get();
memcpy(ptr,&n,sizeof(n));
write(ofs,ptr,sizeof(n));

(3)使用std::vector

  • 使用vector要避免其自动扩容,最好在初始化为0时就指定好要用的内存块大小。
  • vectorvec; 对象本身(即 vec)的控制结构(如大小、容量、指针等)存储在栈上,std::vector 的实际数据内容(即数组)是动态分配在堆上的,这部分内存由 std::vector 自动管理,不需要手动释放。
  • std::vector 的内存是连续的,所以可以直接将整个内存块作为二进制数据写入。
  • std::vector 的内存连续性是由 C++ 标准保证的。标准规定了 std::vector 的存储特性:std::vector 的数据存储在连续的内存块中。所有元素可以使用指针操作进行访问。
  • 可通过vector::data()获得指向堆内存上数组的裸指针
std::ofstream ofs(filePath, std::ios::binary | std::ios::out);
auto size = pixelWidth * channels * 16;
std::vector<char> values(size, 0);//类似于memset(buf,0,size)
if (ofs.is_open()) 
{
  ofs.write((const char*)&values[0], size);//地址是(const char*)&values[0],ofs流向内存块写size个字节
  ofs.close();
}

int n=10;
std::vector<char> values(sizeof(n), 0);//4字节初始化为0
memcpy((const char*)&values[0],&n,4);//将n中数据拷贝到内存块中

(4)使用vector和C数组区别

从功能上看,这段代码中使用 std::vector 替代 std::unique_ptr<char[]> 是完全可以的,因为 std::vector 提供了 .data() 方法来获取底层的裸指针。
从性能上看,对于固定大小的数组,两者性能差异不大,但 std::unique_ptr<char[]> 更轻量级。
从语义上看,std::vector 可能更符合现代 C++ 的风格,因为它提供了更安全和灵活的内存管理方式。

(5)使用std::array

array是连续内存块,内存是连续的,类似于 C 风格数组,所以可以直接读写字节数据。
std::array 的性能接近于 C 风格数组
可通过array::data()获得裸指针
array::fill()成员函数用于将数组中的所有元素设置为指定的值。这是一个非常方便的方法,可以快速初始化或重置数组的内容。

array<char,SIZE> buffer;
 
// 动态分配一个 std::array 对象
std::unique_ptr<std::array<std::uint32_t, 1>> arrPtr = std::make_unique<std::array<std::uint32_t, 1>>();//开辟4*1字节
arrPtr->fill(0); //类似于memset(buf,0,size)
arrPtr->fill(10);//写成10是使用默认的主机序,写成fill(0x0A000000)为大端序
//使用 -> 操作符通过 std::unique_ptr 访问 std::array 的成员函数fill,向内存填充二进制数据
posted @ 2025-06-27 15:41  仰望星河Leon  阅读(51)  评论(0)    收藏  举报