`
hitqiang
  • 浏览: 36155 次
  • 性别: Icon_minigender_1
  • 来自: shangdpng
最近访客 更多访客>>
社区版块
存档分类
最新评论

深入理解sizeof

阅读更多
最近在论坛里总有人问关于sizeof的问题,并且本人对这个问题也一直没有得到很好的解决,索性今天对它来个较为详细的总结,同时结合strlen进行比较,如果能对大家有点点帮助,这是我最大的欣慰了。

一、好首先看看sizeof和strlen在MSDN上的定义:

首先看一MSDN上如何对sizeof进行定义的:

sizeof Operator

sizeof expression

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 of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier enclosed in
parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may include
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof
returns the size of the entire array. The sizeof operator cannot return the size of dynamically
allocated arrays or external arrays.
然后再看一下对strlen是如何定义的:

strlen

Get the length of a string.

Routine Required Header:
strlen <string.h>

size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.

Return Value
Each of these functions returns the number of characters in string, excluding the terminal
NULL. No return value is reserved to indicate an error.

Remarks
Each of these functions returns the number of characters in string, not including the
terminating null character. wcslen is a wide-character version of strlen; the argument of
wcslen is a wide-character string. wcslen and strlen behave identically otherwise.

二、由几个例子说开去。

第一个例子: char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前

int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2     
第二个例子:class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上

第三个例子:char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

三、sizeof深入理解。
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();
printf("%d\n", sizeof(f()));

输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])
fun(char [])

都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len)
{
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}

有关内容见: C++ PRIMER?
10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式
四、结束语

sizeof使用场合。
1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:    void *malloc(size_t size), 
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2.用它可以看看一类型的对象在内存中所占的单元字节。 void * memset(void * s,int c,sizeof(s))

3.在动态分配一对象时,可以让系统知道要分配多少内存。
4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
引自:http://www.vckbase.com/document/viewdoc/?id=1054
分享到:
评论

相关推荐

    深入理解Sizeof

    ### 深入理解 `sizeof` 运算符 #### 引言 在日常的编程工作中,`sizeof` 是一个非常常见的运算符,用于获取变量或类型所占用的内存大小。然而,对于初学者而言,`sizeof` 的行为有时会显得有些神秘。本文将详细解释...

    浅谈sizeof与strlen函数的区别.docx

    《深入理解sizeof与strlen函数的区别》 在编程领域,了解并掌握sizeof和strlen这两个关键函数的用法至关重要,它们在处理内存和字符串长度时起到关键作用。本文将深入探讨这两个函数的概念、工作原理以及它们之间的...

    深入详解sizeof

    "深入详解sizeof" sizeof是一个非常重要的运算符在C和C++编程语言中,它可以返回变量或类型的存储大小,以字节为单位。本文将详细介绍sizeof的各种用法,并对其与strlen的区别进行比较。 一、sizeof的定义 根据...

    《深入理解计算机系统》课后习题答案

    ### 《深入理解计算机系统》课后习题答案解析 #### 知识点一:《深入理解计算机系统》课程及教材概述 - **教材名称**:“Computer Systems: A Programmer’s Perspective”(计算机系统:程序员视角) - **作者**:...

    深入理解计算机系统第三版答案

    ### 深入理解计算机系统第三版答案 #### 一、概述 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective)是一本广泛应用于计算机科学领域的教科书,由Randal E. Bryant与David R. O'Hallaron...

    深入理解C语言指针.pdf

    "深入理解C语言指针" 在C语言中,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存...

    深入理解计算机系统习题答案(最全最详细版)

    ### 深入理解计算机系统 #### 1. 教材介绍 - **书名**:《Computer Systems: A Programmer’s Perspective》 - **作者**:Randal E. Bryant 和 David R. O’Hallaron - **出版日期**:2003年12月4日 - **版权说明**...

    指针深入理解 指针深入理解

    ### 指针深入理解:解析与应用 在计算机编程领域,尤其是C和C++语言中,指针是一个核心概念,它提供了对内存地址的直接访问能力,是实现高效数据处理和复杂算法的关键。本文将从多个角度深入探讨指针的概念、类型、...

    (完整版)深入理解计算机系统(第二版)家庭作业答案.doc

    根据提供的文档信息,我们可以深入探讨《深入理解计算机系统(第二版)》中涉及的一些关键知识点。这份文档似乎包含了第二章的一些家庭作业解答,涉及到计算机系统的底层操作,特别是二进制和位操作方面的问题。下面...

    C++常见面试题

    ### C++面试题详解:深入理解SIZEOF与CONST #### SIZEOF预处理题目解析 **1. 对于结构体的对齐方式** - **结构体s的对齐规则**:`struct s { char a; int b; }; sizeof(s) = 8;` 当结构体内的元素长度小于...

    matlab开发-sizeof

    下面我们将深入探讨`sizeof`函数的使用、作用以及相关的MATLAB数据类型。 首先,`sizeof`函数的基本语法是`sizeof(type)`,其中`type`是你想要查询的数据类型。例如,如果你想知道`double`类型占用多少字节,你可以...

    C++ 面试资料

    #### 二、深入理解sizeof运算符 在C++中,`sizeof`是一个非常重要的运算符,用于获取对象或类型的字节数。对于不同的数据类型,其大小可能不同,了解这一点对于理解内存管理至关重要。 ##### 计算示例 - **字符...

    深入理解计算机系统习题答案

    根据给定文件的信息,本文将深入探讨《深入理解计算机系统》一书中的部分习题解答,特别是关于数据表示与操作的部分。此书由Randal E. Bryant和David R. O’Hallaron编写,并广泛用于教授计算机系统的工作原理,尤其...

    [深入理解计算机系统].(课后答案)Computer.Systems.-.A.Programmers.Perspective.-.Randal.Bryant,.David.O.Hallaron.-.1008.pages.High.Quality.-.2003.Prentice.Hall.djvu

    ### 深入理解计算机系统:《Computer Systems: A Programmer’s Perspective》课后习题解答概览 #### 标题解读: 《深入理解计算机系统》(课后答案)这一资源,是基于Randal Bryant和David O'Hallaron编著的...

    sizeof 的用法(大全)

    本篇文章将全面讲解`sizeof`的用法,并将其与常用的字符串长度函数`strlen()`进行比较,帮助开发者深入理解并解决在使用`sizeof`时可能遇到的难点。 1. `sizeof`基本用法: - 对于基本数据类型,如int、char、...

    详细讲解sizeof的使用

    ### 详细讲解 `sizeof` 的使用 #### 一、`sizeof` 概念解析 `sizeof` 是 C 语言中的一个单目操作符,用于获取指定类型或变量的...通过对 `sizeof` 的深入理解,开发者可以更好地控制程序的内存使用,优化程序性能。

Global site tag (gtag.js) - Google Analytics