sizeof 该注意的一些问题

4 使用sizeof的8大注意事项 sizeof是C/C++语言中的关键字,用于计算变量或者数据类型占用的字节数,返回一个size_t类型的无符号整数。sizeof计算变量占用的字节数时,有两种写法:一种是sizeof(变量),用括号把变量包起来,另一种是sizeof 变量,用空白符进行分隔。sizeof计算数据类型占用的字节数时,只有一种写法:sizeof(数据类型)。sizeof虽然很简单,但使用中还是有一些“坑”和“陷阱”需要我们主动去规避。下面将从8个方面介绍使用sizeof的注意事项。 阅读详情

1.常规
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','/0'};
char   *p1 = "Hello";
char *p2[]={"hello","world"};
int     n = 10;
int    *q = &n;

sizeof (str1 ) = 6    (自动加了'/0')  
strlen (str1 ) = 5    (字符串的长度)  
sizeof (str2 ) = 5     (字符数组的大小)
strlen (str2) = 未知 (该字符串缺少结束符'/0')
sizeof (str3) = 6     (字符数组的大小)
strlen (str3) = 5    (该字符串的长度为5)
sizeof ( p1 ) =   4    (p1是一个指针,大小为4)
sizeof ( p2 ) =   8    (p2是长度为2的字符串数组)
sizeof ( n ) =   4    (整型大小为4)
sizeof ( q ) =   4    (q是一个指针,大小为4)

2.动态分配内存
int *p = (int *)malloc( 100 );
sizeof ( p ) = 4      (p是一个指针,大小为4)

3.函数参数
void Function1( char p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
void Function2( int p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}

4.多重继承
class A{};
class B{};
class C:public A,public B{};
class D:virtual public A{};
class E:virtual public A,virtual public B{};
sizeof ( A ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)
sizeof ( B ) = 1      (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)
sizeof ( C ) = 1      (继承或多重继承后空类大小还是1)
sizeof ( D ) = 4      (虚继承时编译器为该类安插一个指向父类的指针,指针大小为4)
sizeof ( E ) = 8      (指向父类A的指针与父类B的指针,加起来大小为8)

5.数据对齐
类(或结构)的大小必需为类中最大数据类型的整数倍.CPU访问对齐的数据的效率是最高的,因此通常编译浪费一些空间来使得我们的数据是对齐的
class A{
public:
    int a;
};
class B{
public:
     int a ;
    char b;
};
class C{
public:
     int a ;
    char b;
    char c;
};
sizeof(A) = 4 (内含一个int ,所以大小为4)
sizeof(B) = 8    (int为4,char为1,和为5,考虑到对齐,总大小为int的整数倍即8)  
sizeof(C) = 8   (同上)

6.函数与虚函数
编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针,即每个有虚函数的类其大小至少为一个指针的大小4
class A{
public:
    int a;
    void Function();
};
class B{
public:
    int a;
    virtual void Function();
};
class C:public B{
public:
    char b;
};
class D:public B{
public:
    virtual void Function2();
};
class E{
public:
    static void Function();
};
sizeof (A) = 4   (内含一个int,普通函数不占大小)
sizeof (B) = 8   (一个int ,一个虚函数表指针)
sizeof (C) =12   (一个int ,一个虚函数表指针,一个char ,再加上数据对齐)
sizeof (D) = 8   (一个int ,一个虚函数表指针,多个虚函数是放在一个表里的,所以虚函数表指针只要一个就行了)
sizeof (E) = 1   (static 函数不占大小,空类大小为1)

7.父类的私有数据
虽然在子类中不可用,但是是可见的,因此私有的数据还是要占子类的大小
class A{
private:
    int a;
};
class B:public A{};
sizof(B) = 4;    (内含一个不可用的父类的int)
8.大概就这么多了吧,想到再加吧。虚函数,多重继承,空类是比较复杂的,大家大概记住知道就行了

 

 

weiloujushi补充:

class static_D
{
int static intVar;
   static void fun(){}

};

sizeof(static_D) ==1 //静态数据成员不计入类内

WSOLA原理及matlab仿真 WSOLA原理 对于 OLA 算法来说,常常无法保持原信号中的周期性结构,在帧裁剪的过程中,不能保证每一个帧都能覆盖完整周期并保证其相位对齐,会产生相位跳跃失真。 为保证**基频不变**,就要使用 WSOLA 算法。 WSOLA 并不直接在 Ha 处找一帧进行直接拼接,而是在一个区间内寻找与理想帧最接近的一帧进行叠加。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a234f4fde104fc69a9f3ddb7bcf3014.png?x-oss-process=ima 阅读详情

相关推荐

相机中的归一化实现讲解

本分讲解了图像处理中常出现的两个相机归一化操作

weixin_42102084的博客 1475

sizeof 笔试题

 http://www.xici.net/b700278/d44576087.htm1.常规char  str1[] = “Hello” ;char  str2[5] = {H,e,l,l,o};char  str3[6] = {H,e,l,l,o,/0};char   *p1 = "Hello";char  *p2[]={"hello","worl

zgbsoap的专栏 1620

从零构建无线AM信号模拟系统:基于STM32与AD9959的国赛一等奖方案解析

本文详细解析了基于STM32F103RCT6与AD9959芯片构建无线AM信号模拟系统的国赛一等奖方案。文章从项目背景、核心芯片选型出发,深入剖析了系统架构、硬件电路设计及软件控制逻辑,重点分享了“直流偏置叠加法”实现AM调制、多径模拟以及高频电路调试的实战经验与避坑指南,为参加全国大学生电子设计大赛的选手提供了一套完整、可靠的复现路径。

weixin_29182481的博客 181

C语言 -- 字符串

目录 一、字符串的初始化 二、字符串函数 三、strlen 和 sizeof 的区别 一、字符串的初始化 1. char ch[] = {'h','e','l','l','o','w'}; //用数组把字符串的字符一个一个的放进去 2. char str[] = {"hellow"}; //直接用字符型数组来放 3. char *p = "hellow"; //通过指针存储字符串 字符串的最后会自动加上一个 '\0' 表示字符串结束,可以通过过下面例子来了解 #include <

小菜菜~~的博客 905

如何在 Windows 11 上安装 ChatGPT:CMD + 图形界面两种方式

我没说在 Windows 11 上装 ChatGPT 应用有多难,但你要是知道有哪几种官方途径可用,事情就会顺一点,尤其是对新手。对大多数用户来说,商店应用就是正确的选择。如果你在受管理的设备上,或者想避开商店,那么通过 Edge 或 Chrome 装 PWA 是完全站得住脚的替代方案。不管你选哪条路,真正的收获都是把 ChatGPT 从浏览器标签页里挪出来,放进一个它真正像个工具的地方。把它固定到任务栏、配好 Alt + 空格,你就会纳闷以前没它是怎么干活的。

山岚的运维笔记 297

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 474

strlen和sizeof 的区别

下面会举一些具体的例子来说明两者的区别 例子1 #include<iostream> #include<vector> #include<string.h> using namespace std; int main() { char sayhello[] = {'h','e','l','l','o',' ','w','o','r','l','d'...

王学门徒 265

倒立摆的PLC控制(模型分析+ SCL源代码)

首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆的运动方程。

RXXW_Dor的博客 3335

C语言(数组和指针存储字符串)

数组和指针存储字符串

little_startoo的博客 6050

基于simulink的电气弹簧ES稳压控制模型仿真

若要补偿母线电压的谐波,需控制ES上的谐波,即在单闭环母线电压有效值控制的基础上,增加谐波抑制环节来进行谐波控制,现有的各种检测和抑制谐波的方法有采用模拟滤波器、傅里叶分析进行谐波分析、基于瞬时无功功率理论的方法等。当关键负载ZC为电流源型非线性负载时,电路原理图如图7所示,由于电流源型非线性负载可以等效为谐波电流源,关键负载电流ic便会含有谐波分量,导致输电线电流is和母线电压VS同样会含有谐波分量,导致供电质量的严重下降,对用电设备的正常工作造成影响。分别为流过线路阻抗、非关键负载、关键负载的电流,

FPGA/MATLAB学习教程/源码/项目合作开发 1632

风光互补制氢系统动态仿真建模与性能分析

摘要 本文针对离网型风光互补制氢系统,建立了包含光伏阵列、风力发电机、PEM电解槽、储能电池和储氢罐的完整动态数学模型。基于MATLAB/Simulink平台开发了模块化仿真框架,设计了考虑电解槽最小运行功率约束的能量管理策略。通过典型日仿真分析表明,风光互补可有效平抑单一能源的功率波动,系统整体能量效率达58.7%,电解槽负荷跟随特性良好。提出的动态仿真方法为风光制氢系统的优化设计和运行控制提供了有效工具。 关键词:风光互补制氢;PEM电解槽;动态仿真;MATLAB/Simulink;能量管理

huanghm88的专栏 77

char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5};的长度区别,及内存中空间开辟情况...

1, char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5}; 数组是开辟一块连续的内存空间,数组本身的标识符(也就是通常所说的数组名)代表整个数组,可以使用sizeof来获得数组所占据内存空间的大小(注意,不是数组元素的个数,而是数组占据内存空间的大小,这是以字节...

aibaiwu6038的博客 3804

【前端基础篇】HTML5 + CSS3 入门知识

,HTML5和CSS3核心知识

前端知识分享喵 2982

【C++】sizeof和strlen的区别,尤其注意sizeof在结构体中的内存对齐问题

【C++】sizeof和strlen的区别,尤其注意sizeof在结构体中的内存对齐问题

m0_48086806的博客 190

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于sizeof注意的问题

我有一个结构体要求出她的字节数: typedef struct { /*Actual ad/da value */ uint16_t chan_min_raw_value; uint16_t chan_mid_raw_value; uint16_t chan_max_raw_value; uint16_t chan_min_range; uint16_t chan_max_r

jin_bao的博客 333

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sizeof的一个不曾注意的问题

a=256; printf("%d\n", sizeof(++a)); printf("%d\n", a); 打印结果:4, 256 显然,sizeof中的运算并没有计算!   sizeof中的运算不执行是因为sizeof所对应的计算是在编译期完成的,这只需要获得类型信息就足够了...

weixin_34326429的博客 121

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

sizeof運算符需要注意的問題

 sizeof運算符用于取得“東西”的大小,以字節為單位。比如sizeof(char)就返回1,表明char數據類型占一個字節。又如:char str[] = "12345";printf("%d ", sizeof(str));//等于6字符串str占六個字節,這樣做是可行的。如果strlen(str)一把,則等于5,因為strlen返回的是字符串的字符數,不包含結尾的/0。可是

734

C语言高级编程:sizeof计算数组大小需要注意的问题

测试平台:64位X86Ubuntu 1. 代码: #include <stdio.h> void main(void) { char a[20]; printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(&a) = %d\n",sizeof(&a)); printf(...

ARM-Linux 1745

sizeof使用二维数组时注意问题

先上代码: float gcode[10][2]={ {0.00,0.00}, {100.00,0.00}, {100.00,50.00}, {0.00, 50.00}, {0.00,100.00},

zzipeng的博客 621

sizeof()使用请注意类型隐式转换问题

  举个例子:int nTest = 0;if (nTest - sizeof(int) {        printf("###/n");}###没有打印出来再举个例子:int nTest = 0;if (nTest - (int)sizeof(int) {        printf("***/n");}***打印出来了原因:sizeof()返回值是size_t也就是unsig

pizicai105 411

我认为我的编译器有问题: 我注意到sizeof(’a’) 是2 而不是1 (即,不是sizeof(char))。

我认为我的编译器有问题: 我注意到sizeof(’a’) 是2 而不是1 (即,不是sizeof(char))。 可能有些令人吃惊, C 语言中的字符常数是int 型, 因此sizeof(’a’) 是sizeof(int),这是另一个与C++ 不同的地方。

Augusdi的专栏 1325

sizeof浅析(二)

1、什么是sizeof     首先看一下sizeof在msdn上的定义:     The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value

舒夜无痕--成为更好的自己 1702

面试准备(语法)sizeo f和 sizeof(string)的问题

1、什么是sizeof     首先看一下sizeof在msdn上的定义:     The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value

linuxlinuxlinuxlinux的专栏 990

sizeof总结

原文再次http://www.cppblog.com/yearner/archive/2006/09/11/12307.html sizeof()功能:计算数据空间的字节数 1.与strlen()比较       strlen()计算字符数组的字符数,以"\0"为结束判断。       而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示 2.指针与静态数组

Hello world! 1225

sizeof

1、什么是sizeof     首先看一下sizeof在msdn上的定义:     The sizeof keyword gives the amount of storage, in bytes,associated with a variable or a type (including aggregate types). Thiskeyword returns a value of ty

w28971023的专栏 577

Trae IDE安全分析:资源劫持与隐私越界真相

IDE工具是开发者日常编码的核心环境,其性能表现与数据安全直接影响开发效率与企业资产保护。当一款标榜‘智能补全’‘内存优化’的IDE辅助工具持续占用2.5GB内存、绕过VSCode遥测开关、静默采集剪贴板片段与地理位置时,它已超出常规工具范畴,演变为具备进程注入、内存窥探和未授权数据外发能力的高风险软件。这类行为涉及Electron渲染失控、JVM堆泄漏、Windows API深度调用等底层机制,本质是资源侵占与隐私越界双重威胁。本文聚焦Trae IDE这一典型样本,解析其服务驻留、跨进程内存读取、隐蔽遥测

weixin_34417200的博客 343
上一篇: c++ 判断文件夹是否存在
下一篇: C#连接SQL Server 2005 Express的字符串
yangfcf
博客等级 码龄19年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值