c++中sizeof运算符是怎么工作的_c++ sizeof操作符原理解析

sizeof是编译时运算符,返回类型或变量的字节大小,结果为size_t类型;2. 可用于类型名或表达式,不求值仅依赖类型;3. 编译期计算,指针解引用不引发运行错误;4. 数组名sizeof得总大小,传参后退化为指针;5. 结构体包含填充字节,受对齐影响;6. 不适用于函数类型、不完整类型或位域成员。

c++中sizeof运算符是怎么工作的_c++ sizeof操作符原理解析

sizeof 是 C++ 中的一个编译时运算符,用于获取数据类型或变量在内存中所占的字节数。它的结果是一个无符号整数类型 size_t,定义在 头文件中。理解 sizeof 的工作原理有助于编写更高效、可移植的代码。

sizeof 的基本用法

sizeof 可以作用于类型名或表达式:

sizeof(类型):返回该类型的大小(字节)sizeof 变量sizeof(表达式):返回变量或表达式结果类型的大小示例:

int a;cout << sizeof(int) << endl;     // 输出 4(通常)cout << sizeof(a) << endl;       // 输出 4cout << sizeof(3.14) << endl;    // 输出 8(double 类型)

sizeof 在编译期求值

sizeof 的关键特性是它在编译时计算,而不是运行时。这意味着它不会真正执行表达式,也不会对变量进行求值。

即使表达式包含函数调用或副作用,这些都不会发生指针解引用也不会导致运行时错误示例:

int* p = nullptr;cout << sizeof(*p);  // 合法,输出 int 的大小(如 4)                     // *p 不会被实际解引用

这是因为 sizeof 只关心表达式的类型,不关心其值。

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

数组与指针中的 sizeof 行为差异

这是最容易混淆的地方:

数组名使用 sizeof,返回整个数组的字节数对指针使用 sizeof,只返回指针本身的大小(如 8 字节,64 位系统)示例:

void func(int arr[]) {    cout << sizeof(arr) << endl;  // 输出指针大小(如 8)}

int main() {int arr[10];cout << sizeof(arr) << endl; // 输出 40(假设 int 为 4 字节)func(arr);}

在 main 中,arr 是数组类型,sizeof 返回总大小;传入函数后退化为指针,sizeof 只返回指针大小。

结构体和类的 sizeof

对于用户自定义类型,sizeof 返回所有成员的总大小加上填充字节(padding)以满足对齐要求。

编译器为了提高访问效率,会对成员进行内存对齐结构体大小通常是其最大成员对齐要求的整数倍示例:

struct S {    char c;     // 1 字节    int i;      // 4 字节,但需要对齐到 4 字节边界};              // 实际大小为 8(1 + 3 填充 + 4)

可以使用 #pragma packalignas 控制对齐方式,影响 sizeof 结果。

sizeof 不能用于某些情况

以下情况使用 sizeof 会出错或受限:

不能用于函数类型(语法错误)不能用于不完整类型(如未定义的结构体)不能用于位域成员本身(但可用于整个结构体)C++98 中不能用于类的非静态成员函数或成员变量名(需加对象或作用域

基本上就这些。sizeof 看似简单,但在数组退化、类型推导、结构体对齐等场景下容易出错。掌握其编译期求值和类型依赖的本质,能避免很多陷阱。

以上就是c++++中sizeof运算符是怎么工作的_c++ sizeof操作符原理解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 03:04:58
下一篇 2025年12月19日 03:05:15

相关推荐

  • c++中如何链接动态库_c++动态库链接方法

    使用动态库需配置头文件和库路径,链接时指定库名与路径,运行时确保系统能加载库文件,可通过环境变量或手动加载dlopen/LoadLibrary解决。 在C++中使用动态库需要完成两个步骤:编译链接阶段找到库的符号,运行时能正确加载动态库文件。不同操作系统下动态库的后缀和处理方式略有不同(Linux下…

    2025年12月19日
    000
  • c++如何读写二进制文件_c++二进制文件操作方法

    答案是使用fstream类以ios::binary模式操作二进制文件,通过write()和read()函数进行数据读写,结合sizeof处理基本类型和结构体,注意指针成员需手动序列化,并检查流状态确保操作成功。 在C++中操作二进制文件,主要通过标准库中的 fstream 类来实现。与文本文件不同,…

    2025年12月19日
    000
  • c++怎么实现一个观察者模式_c++观察者模式实现方法

    观察者模式通过Subject和Observer实现松耦合,当Subject状态变化时通知所有注册的Observer。定义Observer抽象类包含update纯虚函数;Subject维护Observer指针容器,提供attach、detach和notify方法;ConcreteObserver重写u…

    2025年12月19日
    000
  • c++中string和char*怎么相互转换_c++字符串与字符指针转换

    string转char用c_str()获取只读指针,char转string可用构造函数复制内容,需可修改缓冲区时应预分配空间并取地址。 在C++中,string 和 char* 的相互转换是常见操作,尤其在调用C风格函数或处理底层字符串时非常实用。下面介绍它们之间的转换方法。 1. string 转…

    2025年12月19日
    000
  • c++中new和malloc的区别_c++ new与malloc内存分配区别

    new是C++运算符,具备类型安全、自动计算大小、调用构造函数、抛出异常处理失败,并支持重载和数组分配;malloc是C函数,需手动指定字节、返回void*、不调用构造函数、返回NULL表示失败,且仅通过free释放内存,不兼容析构。2. C++中应优先使用new/delete或智能指针以确保对象正…

    2025年12月19日
    000
  • c++中vector和list的区别是什么_c++ vector与list区别对比

    vector基于连续内存,支持O(1)随机访问和高效缓存利用,适合频繁遍历和尾部操作;list为双向链表,插入删除O(1),但随机访问O(n),迭代器稳定,适用于中间频繁增删场景。 在C++中,vector和list是两种常用的序列容器,它们都属于STL(标准模板库),但底层实现和使用场景有显著差异…

    2025年12月19日
    000
  • c++中priority_queue怎么使用_C++ priority_queue优先队列使用指南

    优先队列默认为最大堆,可通过greater或自定义比较实现最小堆,支持高效插入和弹出操作,适用于贪心、Dijkstra等算法。 在C++中,priority_queue 是一个非常实用的容器适配器,用于实现优先队列。它默认基于堆结构(通常是最大堆),可以自动将元素按优先级排序,每次取出的都是当前优先…

    2025年12月19日
    000
  • c++怎么实现UDP通信_c++ UDP通信实现方法

    C++中实现UDP通信需使用套接字API,首先创建套接字,客户端发送数据到服务器并可接收响应,服务器绑定端口监听并回复客户端,核心函数为sendto和recvfrom,需注意跨平台兼容性及资源释放。 在C++中实现UDP通信主要依赖操作系统提供的套接字(Socket)API。UDP是一种无连接的传输…

    2025年12月19日
    000
  • c++ sort函数怎么自定义排序规则_c++ sort自定义排序教程

    使用自定义规则排序可通过函数对象、Lambda表达式或普通函数实现。1. 函数对象重载()操作符,适用于复杂逻辑;2. Lambda表达式简洁高效,推荐用于简单比较;3. 普通函数指针适合非成员函数场景。均需满足严格弱序要求,Lambda最常用,函数对象适合状态管理,普通函数适用简单情况。 在C++…

    2025年12月19日
    000
  • c++中如何实现Boyer-Moore算法_c++ Boyer-Moore算法实现

    Boyer-Moore算法通过坏字符和好后缀规则从模式串末尾开始匹配,利用预处理跳转表跳过不必要的比较,在C++中通过badchar数组和good_suffix数组实现,主函数结合两者取最大偏移量进行滑动,高效适用于长模式串匹配。 Boyer-Moore算法是一种高效的字符串匹配算法,核心思想是从模…

    2025年12月19日
    000
  • c++怎么使用for each循环_c++ for each循环使用方法

    C++11引入的基于范围的for循环可简化容器遍历,语法为for (declaration : collection),如遍历数组int arr[] = {1,2,3,4,5}; for (int value : arr)可依次访问每个元素。 在C++中,for each 循环通常指的是基于范围的 …

    2025年12月19日
    000
  • C++如何使用CMake来构建项目_C++ CMake构建方法

    使用CMake构建C++项目可实现跨平台编译与清晰的项目结构。1. 创建项目目录project/,包含src/main.cpp和CMakeLists.txt;2. 在main.cpp中编写简单输出程序;3. 编写CMakeLists.txt,设置最低版本、项目信息、C++17标准,并通过add_ex…

    2025年12月19日 好文分享
    000
  • c++中什么是SFINAE(替换失败不是错误)_c++ SFINAE解析

    SFINAE指替换失败不是错误,是C++模板中允许无效模板从重载候选中移除而非报错的机制,支撑std::enable_if等技术,用于类型检测与条件编译,C++17后被if constexpr简化。 SFINAE 是 “Substitution Failure Is Not An Err…

    2025年12月19日
    000
  • c++怎么实现一个跳表_c++跳表实现方法

    跳表通过多层链表实现高效查找,平均时间复杂度O(log n);节点含多级指针,插入时随机生成层级,C++实现包含头节点、层级控制与概率参数。 跳表(Skip List)是一种基于链表的数据结构,通过多层索引提升查找效率,平均时间复杂度为 O(log n)。它结合了链表的插入删除效率和二分查找的速度优…

    2025年12月19日
    000
  • c++中如何使用异常处理try catch_c++异常处理方法

    C++中异常处理通过try-catch结构捕获并处理运行时错误,防止程序崩溃。使用throw抛出异常,可抛出标准库异常(如std::invalid_argument、std::runtime_error)或自定义类型。catch块按顺序匹配异常类型,推荐以const引用方式捕获以避免拷贝和对象切片。…

    2025年12月19日
    000
  • C++如何读写CSV文件_C++ CSV文件读写方法

    C++中可通过标准库fstream、sstream和string实现CSV读写。1. 读取时用std::ifstream逐行读取,std::getline按逗号分割字段;2. 写入时用std::ofstream将每行数据以逗号连接并添加换行符;3. 处理带引号字段需手动解析或使用第三方库如csv.h…

    2025年12月19日
    000
  • C++如何实现一个内存池_C++ 内存池实现方法

    内存池通过预分配大块内存并自行管理分配与回收,减少频繁调用new/delete的开销,适用于高频小对象操作场景。 在C++中,内存池是一种预先分配一大块内存并按需从中分配小块内存的技术,用于减少频繁调用new和delete或malloc/free带来的性能开销。尤其适用于频繁创建销毁小对象的场景,比…

    2025年12月19日
    000
  • c++怎么在构造函数初始化列表中初始化成员_c++构造函数初始化列表方法

    构造函数初始化列表用于高效初始化成员变量,尤其适用于const、引用及无默认构造函数的类类型成员。语法为在构造函数参数后以冒号引出,按成员声明顺序执行初始化,推荐普遍使用以提升性能并避免赋值开销。 在C++中,构造函数的初始化列表是一种在对象创建时直接初始化成员变量的方式,相比在构造函数体内赋值更高…

    2025年12月19日
    000
  • c++如何判断一个数是奇数还是偶数_c++ 奇偶数判断方法

    最常用方法是取模运算,num % 2 == 0为偶数,否则为奇数;另一种高效方法是位运算,num & 1 == 1为奇数,否则为偶数。两种方法均适用于正数、负数和零,取模直观,位运算效率更高。 在C++中判断一个数是奇数还是偶数,最常用的方法是使用取模运算符(%)。通过判断一个整数除以2的余…

    2025年12月19日
    000
  • c++怎么使用指针_c++指针使用方法

    指针用于存储变量地址,通过数据类型 *指针名;声明,用&取地址,*解引用访问值,实现高效内存操作与数据共享。 在C++中,指针是一个非常核心且强大的工具,它用来存储变量的内存地址。合理使用指针可以提高程序效率,实现动态内存管理、函数间数据共享等高级功能。 1. 指针的基本定义和初始化 指针变…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信