0

0

C++中的std::array与普通数组有什么区别?(固定长度的容器化封装)

穿越時空

穿越時空

发布时间:2026-01-15 13:52:08

|

217人浏览过

|

来源于php中文网

原创

std::array不能用sizeof直接算元素个数,因其sizeof返回含对齐填充的总字节大小,非元素数与单元素大小的乘积,必须调用.size()获取编译期确定的长度。

c++中的std::array与普通数组有什么区别?(固定长度的容器化封装)

std::array 为什么不能用 sizeof 直接算元素个数?

普通 C 风格数组(如 int arr[5])传入函数时会退化为指针,sizeof(arr)/sizeof(arr[0]) 在函数内失效;而 std::array 是完整类型,sizeof 返回的是整个对象大小(含元数据),但你不能靠它反推长度——必须用 .size() 成员函数。

  • std::array 的大小在编译期固定,sizeof 包含内部存储 + 可能的对齐填充,不是简单乘积
  • 普通数组在作用域内可用 sizeof 算长度,但一传参就丢失信息;std::array 传参不退化,.size() 始终可靠
  • 误写 sizeof(arr) / sizeof(int)std::array 可能因对齐导致结果错误(比如 std::array 实际占 4 字节

赋值、拷贝和函数参数传递行为差异

普通数组不支持直接赋值(arr1 = arr2 报错),也不能作为函数返回值;std::array 支持完整值语义:可赋值、可返回、可按值传参,底层是 memcpy 级别效率,无堆分配。

  • 普通数组:只能逐元素复制,或用 std::copy / memcpy 手动搬运
  • std::array:支持 ===(C++20 起)、std::sort 直接作用于容器本身
  • 函数参数建议用 const std::array& 避免拷贝,但即使按值传,编译器也常优化掉冗余复制

迭代器与标准算法兼容性问题

std::array 提供 .begin().end().data(),天然适配所有 STL 算法;普通数组需手动传 std::begin(arr)std::end(arr)(C++11 起),否则容易越界或漏掉最后一个元素。

AI Content Detector
AI Content Detector

Writer推出的AI内容检测工具

下载
  • 普通数组用 for (auto& x : arr) 没问题,但传给 std::find 必须显式加 std::begin/endl
  • std::array.data() 返回裸指针,可无缝对接 C API(如 glBufferDatafwrite
  • 注意:std::array 迭代器是原生指针类型,std::distance(it1, it2) 和普通数组一样是 O(1)

初始化语法和编译期约束的实际影响

std::array 构造要求严格:聚合初始化必须显式写出全部元素,或用 std::array{} 零初始化;普通数组允许省略部分初始值(剩余为零)或用 {0} 快速清零。

立即学习C++免费学习笔记(深入)”;

std::array a1 = {1, 2, 3};        // OK
std::array a2 = {1};               // OK → {1, 0, 0}
std::array a3{1, 2};              // 编译错误:缺少第三个元素
int c_arr[3] = {1};                        // OK → {1, 0, 0}
int c_arr2[] = {1, 2};                     // OK → 推导长度为 2
  • std::array 的模板参数 N 必须是常量表达式,无法运行时确定;普通数组在上声明也需编译期长度,但动态数组(new int[n])不受限
  • auto 推导 std::array 类型时,必须确保初始化器个数匹配,否则编译失败
  • 调试时,std::array 在多数 IDE 中能展开查看所有元素;普通数组有时只显示首地址
真正卡住人的地方往往不是“能不能用”,而是“什么时候必须用 .size() 而不是 sizeof”、以及“传进模板函数后,怎么写泛型代码才能同时接受两者”。这些边界情况不试几次,光看文档很难踩准。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

385

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

537

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

388

2023.07.18

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号