sizeof和strlen

Verilog除法器(32位无符号+带符号) 32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a reg_b 存放除数b reg_r 存放余数(初始清零) 具体做法: 做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正... 阅读详情

总结一下这两个的用法,发现还挺多。

重点:

1 sizeof和strlen的区别

2 结构体中数据对齐的法则

    1) 结构体每个成员相对于结构体首地址的偏移量都是(这个)成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal padding); 2) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。                                                                                                                                                                                                             

3  #pragma pack(n)其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,

参考一道题:

struct S2
{
char c;
    int i;
};
     struct S3
{
char c1;
  short ss;
S2 s;
char c2;
};


struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
cout<<sizeof(S3)<<endl;
cout<<sizeof(short)<<endl;
    cout<<sizeof(BF2)<<endl;

输出:

16
2
6


以下是详解,主要参考百度百科:http://baike.baidu.com/view/1078660.htm

1  基本定义

  sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个类型所占的内存字节数。

   与strlen的区别:

        strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

  char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
  char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
  char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
  而sizeof()函数返回的是 变量 声明后所占的内存数,不是实际长度。

例如,sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子:

char foo()

  {
  printf("foo() has been called.\n");
  return 'a';
  }
  int main()
  {
  size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof(char ),foo()并不会被调用
  printf("sizeof( foo() ) = %d\n", sz);
  }

2   C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:

  sizeof( foo );// error
  void foo2() { }
  sizeof( foo2() );// error
  struct S
  {
  unsigned int f1 : 1;
  unsigned int f2 : 5;
  unsigned int f3 : 12;
  };
  sizeof( S.f1 );// error

3  数组的sizeof

  数组的sizeof值等于数组所占用的内存字节数,如:
  char a1[] = "abc";
  int a2[3];
  sizeof( a1 ); // 结果为4, 字符  末尾还存在一个NULL终止符
  sizeof( a2 ); // 结果为3*4=12(依赖于int)

   void foo3(char a3[3])

  {
  int c3 = sizeof( a3 ); // c3 ==
  }
  void foo4(char a4[])
  {
  int c4 = sizeof( a4 ); // c4 ==
  }
  也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将 实参 的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。


4  结构体的sizeof(主要分析偏移量就行)

  字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

  1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是(这个)成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal padding);
  3) 结构体的总大小为结构体最宽 基本类型 成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
2) 基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型,这里所说的“数据宽度”就是指其sizeof的大小。由于结构体的成员可以是复合类型,比如另外一个结构体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。

struct S1

  {
  char c;
  int i;
  };
 

struct S3

  {
  char c1;
  S1 s;
  char c2;
  };

结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )


5 #pragma pack(n)

有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。

#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么

该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,
  公式如下:
  offsetof( item ) = min( n, sizeof( item ) )
  再看示例:
  #pragma pack(push) // 将当前pack设置压栈保存
  #pragma pack(2) // 必须在结构体定义之前使用
  struct S1
  {
  char c;
  int i;
  };
  struct S3
  {
  char c1;
  S1 s;
  char c2;
  };
  #pragma pack(pop) // 恢复先前的pack设置
  计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i)等于6,能够被2整除,所以整个S1的大小为6。
  同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等于9,不能被2整除,添加一个填充字节,所以sizeof(S3)等于10。
 
  还有一点要注意,“空结构体”(不含 数据成员 )的大小不为0,而是1。
  struct S5 { };
  sizeof( S5 ); // 结果为1


 6  含位域结构体的sizeof

  前面已经说过,位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。
  C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是压缩存储,其大致规则为:
  1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
  2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的 存储单元 开始,其偏移量为其类型大小的整数倍;
  3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
  4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
  5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
  还是让我们来看看例子。
  示例1:
  struct BF1
  {
  char f1 : 3;
  char f2 : 4;
  char f3 : 5;
  };
  其内存布局为:
  |_f1__|__f2__|_|____f3___|____|
  |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
  0 3 7 8 1316
  位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只
  能从下一个字节开始。因此sizeof(BF1)的结果为2。
  示例2:
  struct BF2
  {
  char f1 : 3;
  short f2 : 4;
  char f3 : 5;
  };
  由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。
  示例3:
  struct BF3
  {
  char f1 : 3;
  char f2;
  char f3 : 5;
  };
  非位域字段穿插在其中,不会产生压缩,在VC6和Dev-C++中得到的大小均为3。

 7  联合体的sizeof
  结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。结构体的成员也可以是复合类型,这里,复合类型成员是被作为整体考虑的。
  所以,下面例子中,U的sizeof值等于sizeof(s)。
  union U
  {
  int i;
  char c;
  S1 s;
  };

union V
{
struct X
{
unsigned char s1 : 2;
unsigned char s2 : 3;
unsigned char s3 : 3;
} x;

unsigned char c;
};

void main()
{
V v;
v.c = 100;
printf("%d", v.x.s3);
}
定义了一个联合,也就是x和c占用同一个空间,这里面x采用了位域表示方法,也就是s1只占2位,s2占3位,s3占3位,总共8位。而这个空间又可以解释为一个字符c,因此对v.c=100来说,下一句是把这个100占用的空间解释成结构x,而100换成二进制后为01100100,从后往前分别截取2,3,3位分别赋给s1,s2,s3.因此s3获得最高的011,也就是3,输出结果就是3

7 结构体嵌套联合体

union u
{
char uc;
int ua[5];
double ud;
};
struct pp
{
char a;
u uu;
int i;
};

void  main()
{    
    
cout<<sizeof(pp)<<endl;
cout<<sizeof(u)<<endl;
        getchar();
}


结果:

40 ,24

因为union中是24,且以8字节对齐。

所以导致struct中也以8字节对齐


华为交换机与思科/华三设备LACP对接实战:手把手教你配置链路聚合 本文详细解析了华为交换机与思科、华三设备间的LACP链路聚合配置实战,涵盖核心原理、配置步骤及排错技巧。通过对比不同厂商的实现差异,提供可落地的跨厂商对接方案,助力企业网络工程师高效部署高可靠性链路聚合。 阅读详情

相关推荐

毫米波雷达之CFAR 目标检测

恒虚警率(CFAR)算法是一种广泛应用于雷达目标检测的算法,其主要目 标是减少由于杂波与回波之间强度不对称而引起的误报,以确保相对恒定的虚警 率。如图 3.4(a)所示,表示由距离单元组成的一维数据。在待测单元 D 周围选 择若干个背景杂波功率的蓝色单元构成参考滑窗,称为参考单元;而待测单元 D 相邻的若干个不用于背景估计的单元则称为保护单元。当参考单元和保护单元的 维度从一维扩展到二维时,相应的 CFAR 检测由一维 CFAR 演变为二维 CFAR 以处理参考窗口,如图 3.4 (b)所示。

m0_56120826的博客 4920

编译时知道sizeof的大小

sizeof(int), sizeof(double)之类是在编译期就计算出来了的,怎样在编译期就能知道某个类的大小呢?且看下面:class MyClass{    // ...}; 要在编译期知道MyClass的大小,先写个辅助类,template class CalcSize;随便在哪个CPP中写下一行 CalcSize();再编译,就会有类似错误error C2514: “CalcSize”

smart的专栏 1618

菲涅尔波带片

菲涅尔波带片的简介,以及matlab绘制

Bestchinese的博客 1万+

sizeof 利用预编译查看数据结构占用内存空间

偶然看到很久以前的一个代码片段,分享出来。 代码功能:展示各种数据结构占用的内存空间大小 要点1:sizeof是编译时转换为数字的,运行时已经相当于常量 要点2:宏变量转换字符串 #include <stdio.h> #include <stdlib.h> #define SPACE(T) printf("%20s:%5d B \n",#T,sizeof(T...

yilonglucky 976

OpenAI Realtime API实时语音交互实战指南

实时语音交互是人机自然对话的核心能力,其本质在于构建低延迟、双向、流式协同的音频-语义闭环。它突破传统REST API的请求-响应范式,依托WebSocket实现毫秒级音频输入流(audio.delta)、模型生成流(text/audio.delta)与动态控制流(session.update)三重并行。该技术显著降低端到端延迟至300ms以内,支撑语音助手、智能客服、对话式教育等强实时场景。本文聚焦OpenAI Realtime API的工程落地,详解PCM音频流处理、VAD语音活动检测、AudioCon

weixin_32285357的博客 390

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

在编译时检查sizeof

今天在写文件系统时,想在编译时检查一些struct的大小,就发现了这篇blog,讲得是内核里面的BUILD_BUG_ON的实现,这个优雅精妙的实现让我对内核开发者的敬佩之情真是油然而生啊!! 有时候,我们在写C程序的时候需要对struct的大小做一些限制。比如说,struct需要以某些字节大小进行对齐,以符合硬件的支持(也许是某个设备的DMA缓冲区,要使用地址的低位做一些其他的计算),并且这些s

sunwukong54的专栏 3344

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3944

strlen和sizeof的区别

strlen和sizeof的区别

小小码农 3万+

因果推断综述-A Survey on Causal Inference

最近读到一篇讲述很全面的综述文献-《A Survey on Causal Inference》,对于接触因果推断不久的同学而言是特别详细的介绍和科普。文献很长,我会分成几部分介绍。 目录 摘要 第一部分:简介 第二部分:因果推断基础知识 第三部分:基于三种假设的因果推断方法 第四部分:实验 第五部分:应用 摘要 几十年来,因果推理是一个跨许多领域的关键研究主题,如统计、计算机科学、教育、公共政策和经济学。与随机对照试验相比,研究方向由于可用数据量大且预算要求低,如今,从观测数据..

海边凝望的博客 3182

innovus:ccopt_design分段长tree操作

这步don't touch保证后面完整cts尽量不会动到已经长过的tree。需要给sub tree手写一个spec,参考create_ccopt_clock_tree_spec -file的写法,只写create_ccopt_clock_tree和skew group部分就行。

m0_61544122的博客 1675

sizeof()和strlen的区别

首先得区别清楚: sizeof()是运算符,在头文件的类型为unsigned int,其运算值在编译时就计算好了,参数可以是指针、数组、类型、对象和函数等; strlen()是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化为指针了。该函数完成的功能是从代表该字符串的第一个地址开始遍历的,直到遇到结束符NULL。返回的长度大小不包括NULL。 ...

Victor的BLOG 1万+

工业质检升级!C#上位机集成YOLOv8.3.138+Blob分析:尺寸测量+缺陷检测一步到位

工业场景的技术选型,从来不是“选最先进的”,而是“选最适配的”。这个项目的成功,不在于采用了多前沿的技术,而在于找对了“贴合场景的技术组合”和“落地导向的实施思路”。C#上位机的稳定性保障了系统长期运行,YOLOv8.3.138的精度解决了缺陷检测痛点,Blob分析的抗干扰能力确保了尺寸测量准确,三者结合实现了“1+1+1>3”的效果。先摸透场景,再选技术:不要盲目追求最新模型,先深入了解车间环境、生产节奏、精度要求,选择兼容性强、稳定性高的技术方案;数据质量决定模型性能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 608

C语言中strlen和sizeof的区别

C语言中,strlen和sizeof使用时的区别和使用方法

川子767的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C语言】sizeof和strlen的区别

sizeof和strlen的到底有啥区别,怎么用呢?

学了就忘是正常现象 3716

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

sizeof和strlen的小知识

C语言小知识

2401_84577633的博客 1630

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

关于sizeof和strlen和数组

你真的了解sizeof和strlen吗?

wz_290793的博客 1462

详解sizeof和strlen

strlen和sizeof的使用和区别,字符0,数字0,和'\0'的区别

something for nothing的博客 2936

sizeof和strlen的区别

sizeof 是操作符,sizeof 计算变量所占内存内存空间⼤⼩的,,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

m0_69135494的博客 789

sizeof 和 strlen 的区别

它只用于以 '\0' 结尾的字符数组(C风格字符串),例如 char str[] = "hello";strlen(str) 返回的值是5。1. 在C语言中最好使用 %zd 来输出 strlen 和sizeof的结果- 原因是 strlen 函数(定义在 <string.h> 头文件中)的返回值类型是 size_t。size_t 是无符号整数类型,通常用于表示大小相关的量,如对象大小、计数等。- 例如:c 复制return 0;

daiwoliyunshang的博客 865

sizeof 和 strlen 的对比

本篇文章主要围绕着sizeof和strlen展开叙述,主要目标是了解这两个的用法,注意事项,以及辨析两者间的区别。

Alenenen的博客 843

sizeof和strlen的对比分析

本文对比了C语言中sizeof运算符和strlen函数的关键区别。sizeof是编译时运算符,用于计算变量或类型的内存大小(含空字符),适用于任意数据类型;strlen是运行时库函数,统计字符串中'\0'前的字符数(不含空字符),仅适用于字符串。主要差异体现在:sizeof计算数组时包含整个空间,而strlen只计有效字符;对指针使用sizeof得到指针大小,strlen则计算指向的字符串长度。正确理解二者的特性可避免内存和字符串处理错误,注意strlen要求字符串必须正确终止,否则会导致未定义行为。

祯的博客 1050

sizeof() 与 strlen()的区别

深入理解sizeof作者:房秉毅  最近在论坛里总有人问关于sizeof的问题,并且本人对这个问题也一直没有得到很好的解决,索性今天对它来个较为详细的总结,同时结合strlen进行比较,如果能对大家有点点帮助,这是我最大的欣慰了。一、好首先看看sizeof和strlen在MSDN上的定义:首先看一MSDN上如何对sizeof进行定义的:sizeof Operatorsizeof exp

Louis的专栏 2493

strlen和sizeof

strlen 和 sizeof 是 C 语言中两个用于确定字符串或数据类型大小的常用操作符,但它们的工作方式和目的有所不同。下面是对这两个操作符的详细解释:

weixin_40026739的博客 1279
上一篇: 快排的非递归算法
下一篇: 随机数算法之从N个数中取M个数
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值