美文网首页
c/c++中的“大小,长度”问题

c/c++中的“大小,长度”问题

作者: 非墨即白 | 来源:发表于2018-03-07 20:45 被阅读0次

c/c++中的“大小,长度”问题

1.显式缓冲区的sizeof和strlen

charbuf[10] = “hello”;size_ta =sizeof(buf);size_tb =strlen(buf);

a的值为10,b的值为5,这是因为sizeof(buf)计算的是字符数组的大小,strlen(buf)计算的是“hello”的长度。

2.隐式缓冲区的sizeof和strlen

charbuf[] = “hello”;size_ta =sizeof(buf);size_tb =strlen(buf);

a的值为6,b的值为5,这是因为buf的大小在编译期就确定了,它的大小刚好能保存字符串“hello”,而字符串默认后面还有一个’0’字符,它占用一个字节,故sizeof(buf)是6,strlen(buf)为5。

3.参数的sizeof(64位主机)

voidfun(void* p,chardata[10]){size_ta =sizeof(p);size_tb =sizeof(data);}

a的值为8,b的值也是为8,这是因为a为指针,在64位主机中指针类型长度为8个字节;而有人会疑问为什么b的大小不是10,而是8呢?在c/c++中传递数组参数时会退化成传递指针,这其实也很好理解,因为没必要传递参数的时候全拷贝数组元素,那样太低效了,传递数组头指针即可,在函数通过数组头指针就可以访问数组中的任意元素。

4.空类的sizeof

class Test{    //nothing.};Test t;size_t a = sizeof(t);

a的值为1,这是因为即使a是空类对象,它也需要常用存储空间,而编译器在这种情况下给空类分配了一个字节,故大小为1。

5.只有一个int32的类对象的sizeof

class Test{    int32_t m_data;};Test t;size_t a = sizeof(t);

a的值为4,这是因为Test不再是一个空类,它的对象中存储着一个int32_t的变量,故大小为4。

6.在5的基础上多一个普通成员函数的类对象的sizeof(64位主机)

class Test{    int32_t m_data;    void fun(){};};Test t;size_t a = sizeof(t);

a的值为4,这是因为普通函数只是文本段(text段)中的一段执行代码,由类的所有对象共享,不会占用对象的空间,故此时类对象的大小还是4。

7.在6的基础上多一个虚成员函数的类对象的sizeof(64位主机)

class Test{    int32_t m_data;    void fun(){};    virtual fun_v(){};};Test t;size_t a = sizeof(t);

a的值为12,这是因为当类引入虚函数时,类对象中需要一个虚表指针来实现多态,在64位主机一个指针占用8个字节,故类大小为12。

8.在7的基础上多一个int32静态成员变量的类对象的sizeof(64位主机)

classTest{int32_tm_data;staticint32_tm_static_data;voidfun(){};virtualvoidfun_v(){};};Test t;size_ta =sizeof(t);

a的值为12,这是因为类的静态成员变量是类共享的,不占用类对象的空间,相当于c中静态变量只是它被限定在类的命名空间(namespace)中,故类对象大小为12。

9.在8的基础上多一个静态成员函数的类对象的sizeof(64位主机)

classTest{int32_tm_data;staticint32_tm_static_data;voidfun(){};virtualvoidfun_v(){};staticvoidfun_s(){};};Test t;size_ta =sizeof(t);

a的值为12,这是因为静态成员函数和普通成员函数一样是文本段(text段)中的一段执行代码,不占用类对象空间,被限定在类的命名空间中,故大小为12。

10.注意点

如果大家写测试demo验证添加了虚函数后类对象的大小时可能得到的大小不是12,而是16,这是因为此时类是以8字节(虚表指针的大小)对齐,此时只要在代码中指定4字节对齐(#pragma pack(4)),类对象大小就是12,至于内存对齐的概念大家自行去百度吧。

相关文章

  • c/c++中的“大小,长度”问题

    c/c++中的“大小,长度”问题 1.显式缓冲区的sizeof和strlen charbuf[10] = “hel...

  • c/c++中的“大小,长度”问题

    1.显式缓冲区的sizeof和strlen a的值为10,b的值为5,这是因为sizeof(buf)计算的是字符数...

  • python3 c++ 和 java

    基本语法 长度 python c++ java 标准化输入&输出 python c++在C++中,标准的输入输出是...

  • C++学习笔记目录

    C++初步 C++数据长度 C/C++ 堆 栈 静态 常量 代码 区 static关键字 C++类和对象 C++引...

  • C/C++32位与64位数据类型占用的字节数

    C++继承、虚继承、虚函数类的大小问题

  • 长度为0的数组

    数组的长度在编译时就确定了。长度为0的数组在标准C和C++中是不允许的,编译时会产生错误。但在GNU C中,这种用...

  • 一.预备知识

    C++对大小写敏感,也就是区分大小写。 C++必须包含一个名为main()的函数。 C++注释以 // 开头。 如...

  • 闲聊c/c++: 再谈内存(c/c++,java,c#,js,o

    本篇目的: c/c++中如何判断大小端的函数 c/c++中通过指针法,移位法获取多字节数据类型中的各个字节 jav...

  • 串匹配之蛮力算法

    基于邓俊辉老师的c++数据结构 问题描述:给定文本串T,长度n 如:1001101101模式串P,长度m,如: ...

  • C/C++ 数据长度

    知识点 C/C++基本数据类型在各平台下的长度(所占字节) 类所占字节(例题5) 基本数据类型 通过指针大小,可以...

网友评论

      本文标题:c/c++中的“大小,长度”问题

      本文链接:https://www.haomeiwen.com/subject/iopsfftx.html