展开

关键词

C++核心准则ES.47: 使用nullptr表现指针,而不是0或NULL​

ES.47: Use nullptr rather than 0 or NULL 而不是ES.47: 使用nullptr表现指针,而不是0或NULL Reason(原因) Readability 同时nullptr具有良好定义(非常严格的)的类型,很多情况下使用NULL或0会导致类型推断出错,但使用nullptr就不会。 Example(示例) Consider: 考虑以下代码: void f(int); void f(char*); f(0); // call f(int) f(nullptr); // call f(char*) Enforcement(实施建议) Flag uses of 0 and NULL for pointers. 标记使用0或者NULL表现指针的情况。这种变换可以或许可以通过简单的程序进行。

21220

C++大小的计算

首先我们看什么都没有的时候的例子: class test{ }; 可以看到,实例化的对象的大小为1。 这是因为即使是空白,编译器也会分配一个字节的空间来占位,用来和真正的空白/变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那么就和没有实例化差不多了)。 不过注意的是,如果空白作为基被继承了的话,是不会对继承它的的空间产生影响的,即在继承的一瞬间,基大小变为0,而继承它的大小只与自己的成员变量有关(此处默认为单一继承): #include < 如果不是连续放着的,那么会分别补齐到4字节。因此,尽量“凑”变量类型到4字节,这样可以让补齐后的实例大小小一些。 ++中空占一字节原因详解:建议看,对空白的讲解比较详细 sizeof计算空间大小的总结 《C++ Primer 第5版》

12020
  • 广告
    关闭

    腾讯云618采购季来袭!

    腾讯云618采购季:2核2G云服务器爆品秒杀低至18元!云产品首单0.8折起,企业用户购买域名1元起,还可一键领取6188元代金券,购后抽奖,iPhone、iPad等你拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浅析C++内存布局

    C++程序在内存中的布局是怎样的?总结下C++内存布局的相关知识。 概述 简单总结下C++变量在内存中的布局和可执行文件相关的知识。暂未涉及虚函数,虚函数表,的继承和多态等C++对象的内存模型。 对象所占的内存空间  一个实例化对象所占空间的大小? 注意不要说大小,是的对象的大小。 首先,大小是什么? int main() { Test test; std::cout << sizeof(test) << std::endl; //1 return 0; } 可以看到一个对象的大小 一个对象的大小是1,为什么不是0A明明是,它的大小应该为0,为什么编译器输出的结果为1呢? 这就是实例化的原因类同样被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个隐含的加一个字节,这样实例化后在内存中得到了独一无二的地址,所以obj的大小

    6940

    精选 30 个 C++ 面试题(含解析)

    不存在指向值的引用,但是存在指向值的指针。 22.基的析构函数不是虚函数,会带来什么问题? 派生的析构函数用不上,会造成资源的泄漏。 23.全局变量和局部变量有什么区别?是怎么实现的? } 大小是1, 在C++中空会占一个字节,这是为了让对象的实例能够相互区别。 具体来说,类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给隐含加上一个字节,这样实例化之后就会拥有独一无二的内存地址。 当该空白作为基时,该类的大小就优化为0了,子类的大小就是子类本身的大小。这就是所谓的空白基最优化。 实例大小就是大小,所以sizeof(a)=1字节,如果a是指针,则sizeof(a)就是指针的大小,即4字节。

    7030

    读《C++语言的设计与演化》及一些疑问的解答

    如果带的C(甚至是C++)被定义成需要垃圾回收的语言,它一定会更优雅些,但也会是一个死胎。 C++与C的关系? “ ···一个共同的意见逐渐浮现出来:在C++和ANSI C之间不应该存在无故的不兼容性[Stroustrup,1986],而确实应该有一些不兼容性,只要它不是无故的。 +的编译器(GCC/G++)下编译运行的结果是完全不同的(GCC:0/G++:1)。 +方式编译)outer时,他有一个隐藏的1byte大小,那是被编译器安插进去的一个char。 (深度探索C++对象模型P84) 因为 C++ 中由于实例化的原因类同样可以被实例化),每个实例必须在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个隐含的加一个字节,这样实例化后就能在内存得到了独一无二的地址

    16720

    HotSpot源码分析之C++对象的内存布局

    也会占用内存空间的,而且大小是1,原因C++要求每个实例在内存中都有独一无二的地址。 在HotSpot中,经常需要计算本身需要占用的内在大小,只要通过sizeof来计算即可。 因为和对象本来就不是一个概念,分别使用不同的对象模型描述符合软件开发的设计思想。 | base1_var1 1> 4 | base1_var2 1> +--- 可以看到,成员变量是按照定义的顺序来保存的,对象的大小就是所有成员变量的大小之和。  好了,关于对象的布局我们就简单的介绍到这里,因为毕竟不是在研究C++,只要够我们研究HotSpot时使用就够了,更多关于内存布局的知识请参考其它文章或书籍。

    18720

    C++:05---class和struct

    struct为的结构体 表示占位为0字节,那么class为的sizeof的意义呢: 一个实例化对象所占空间的大小?注意不要说大小,是的对象的大小. 首先,大小是什么? 确切的说,只是一个类型定义,它是没有大小可言的。用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。 为什么是大于等于而不是正好相等呢? 后者依赖于不同的编译器实现,C++标准对此不做任何保证。 C++标准规定大小不为0大小为1,当不包含虚函数和非静态数据成员时,其对象大小也为1。 如果在中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键

    18330

    C++和对象以及成员函数

    参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是,属性是成员变量,行为是成员函数。  在C++中,结构体默认是全部都可见的,而中默认是私有的。  ②的结构体在C语言编译通不过,会报错;在C++大小为1;不过在Linux环境里大小则为0C++大小也为1。  这时就会有一个疑问??大小为何是1而不是0呢??  实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占多少内存,由编译器决定。VS中是1。  调用的时机是在return 0;后在}前,先构造的对象后析构。

    29120

    C++面试知识总结

    1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 inline函数是函数,宏不是函数。    2.6 new/delete和malloc/free的区别 new/delete用调用构造函数来实例化对象和调用析构函数释放对象申请的资源。 2.14 野指针,未初始化指针和指针的区别 野指针:指向一个已删除的对象或无意义地址的指针。 原因:指针变量没有被初始化,或者指针p被free或者delete之后,没有置为NULL。   2.20 sizeof用在不同对象上的区别 sizeof是C语言的一种单目操作符,并不是函数。sizeof以字节的形式返回操作数的大小。 我们常见的指针一般指向 0 地址,即指针的内部用全 0 来表示。指针的“逻辑地址”一定是0,对于指针的地址,操作系统是特殊处理的。并非指针指向一个0地址的物理地址。

    45541

    cc++问题集五

    用法:在C++中,通过构造std::mutex的实例创建互斥元,调用成员函数lock()来锁定它,调用unlock()来解锁,不过一般不推荐这种做法,标准C++库提供了std::lock_guard模板 内存对齐的主要作用是: 1、  平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、  性能原因:经过内存对齐后,CPU的内存访问速度大大提升。CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。 当然,到底默认是public继承还是private继承,取决于子类而不是。 懒汉:故名思义,不到万不得已就不会去实例,也就是说在第一次用到实例的时候才会去实例化, 饿汉:饿了肯定要饥不择食。所以在单例定义的时候就进行实例化。

    6830

    关于Java代码优化的N条建议!

    但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。 在C/C++中,”if (i == 1)”判断条件成立,是以0与非0为基准的,0表示false,非0表示true,如果有这么一段代码: ? C/C++判断”i==1″不成立,所以以0表示,即false。但是如果: ? 万一程序员一个不小心,把”if (i == 1)”写成”if (i = 1)”,这样就有问题了。 1混淆,这个点非常细节,值得注意 39、所有重写的方法必须保留@Override注解 这么做有三个原因: (1)清楚地可以知道这个方法由父继承而来; (2)getObject()和get0bject( ,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数 解释一下竞争同一个seed导致性能下降的原因,比如,看一下Random

    26520

    阿里P8架构专家关于Java代码优化的N条建议!

    但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。 在C/C++中,”if (i == 1)”判断条件成立,是以0与非0为基准的,0表示false,非0表示true,如果有这么一段代码: ? C/C++判断”i==1″不成立,所以以0表示,即false。但是如果: ? 万一程序员一个不小心,把”if (i == 1)”写成”if (i = 1)”,这样就有问题了。 1混淆,这个点非常细节,值得注意 39、所有重写的方法必须保留@Override注解 这么做有三个原因: (1)清楚地可以知道这个方法由父继承而来; (2)getObject()和get0bject( ,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数 解释一下竞争同一个seed导致性能下降的原因,比如,看一下Random

    24120

    Java内存泄漏、性能优化、宕机死锁的N种姿势

    导读 本文介绍Java诸多优化实例:第一,排查堆上、堆外内存泄露;第二,使用arthas、jaeger、tcpdump、jstack做性能优化;第三,排查进程异常退出的原因,如被杀、System.exit 、Java调用的C++发生Crash、Java内Crash;第四,排查死锁的原因,如log4j死锁、封装不严谨导致的死锁 内存泄漏 内存泄露在C++里排查很简单,用钩子函数勾住内存分配和释放函数malloc 因为线程堆栈不包含业务代码,都是JDK的源码,因此用线程堆栈搜索JDK相关问题,最终发现是JDK8的Bug:JDK-8129861,该Bug在创建大小0的线程池时容易触发,因此在应用代码里,将大小0 另外,core.pid完整的保留了C++组件Crash时的现场,包括变量、寄存器的值等,如果真的因为C++组件有Bug而Crash,例如指针等。 首先自行找到C++源码,找出怀疑指针的变量{variableName},通过在gdb里执行命令:p {variableName},可以看出每个变量的值,从而找出指针的变量。

    18020

    C++对象所占的内存空间

    对于一个什么都没有定义的来说,它的大小不是0,而是1,因为实例化对象会获得一个独一无二的地址,也是为了区别该类的不同对象。 在深度探索C++对象模型中是这样说的:那是被编译器插进去的一个char,使得这个class的不同实体(object)在内存中配置独一无二的地址。 也就是说这个char是用来标识的不同对象的。        如果在中定义成员函数(包括静态成员函数),不占用对象的内存空间。即每个都只有一个,如有多个对象去共享这一个成员函数。 对于虚函数来说,是基于的,每创建一个虚函数,在中就会产生一个指向虚函数地址的指针,那么这些指针就存放在一个表里,这个表就被称为虚函数表(virtual table[vrbl])。 对于有虚函数的对象来说,只要中包含有虚函数(无论是1个还是多个),那么对于对象来说都额外占用4个字节的内存。原因就是因为系统在对象中添加了一个指向虚函数表的指针,通常叫做vptr。

    59630

    44个Java代码性能优化总结

    但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。 在C/C++中,"if (i==1)"判断条件成立,是以0与非0为基准的,0表示false,非0表示true,如果有这么一段代码: int i = 2; if (i == 1) { ... } else { ... } C/C++判断"i==1"不成立,所以以0表示,即false。 所有重写的方法必须保留@Override注解 这么做有三个原因: 清楚地可以知道这个方法由父继承而来 getObject()和get0bject()方法,前者第四个字母是"O",后者第四个子母是"0" 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数 解释一下竞争同一个seed导致性能下降的原因

    506130

    Java常见异常类型及原因分析

    0x1 NullPointerException异常 顾名思义,NullPointerException 是指针异常。但是在 Java 中没有指针,怎么会有 指针异常呢? 在 C++中,声明的指针需要指向一个实例(通过 new 方法构造),这个指针可以理解为 地址。 在 Java 中,虽然没有指针,但是有引用(通常称为对象引用,一般直接说对象),引 用也是要指向一个实例对象(通过 new 方法构造)的,从这种意义上说,Java 中的引用与 C++中的指针没有本质的区别 所以这里的 NullPointerException 虽然不是真正的指针异常,但本质上差不多,是 因为引用没有指向具体的实例,所以当访问这个引用的方法的时候就会产生这种异常。 0x5 NumberFormatException异常 数字转换异常,在把一个表示数字的字符串转换成数字类型的时候可能会报这个异常,原因是作为参数的字符串不是由数字组成的。

    2.3K40

    Java内存泄漏、性能优化、宕机死锁的N种姿势

    导读 本文介绍Java诸多优化实例:第一,排查堆上、堆外内存泄露;第二,使用arthas、jaeger、tcpdump、jstack做性能优化;第三,排查进程异常退出的原因,如被杀、System.exit 、Java调用的C++发生Crash、Java内Crash;第四,排查死锁的原因,如log4j死锁、封装不严谨导致的死锁 内存泄漏 内存泄露在C++里排查很简单,用钩子函数勾住内存分配和释放函数malloc 因为线程堆栈不包含业务代码,都是JDK的源码,因此用线程堆栈搜索JDK相关问题,最终发现是JDK8的Bug:JDK-8129861,该Bug在创建大小0的线程池时容易触发,因此在应用代码里,将大小0 另外,core.pid完整的保留了C++组件Crash时的现场,包括变量、寄存器的值等,如果真的因为C++组件有Bug而Crash,例如指针等。 首先自行找到C++源码,找出怀疑指针的变量{variableName},通过在gdb里执行命令:p {variableName},可以看出每个变量的值,从而找出指针的变量。

    1K41

    Java代码优化总结(长期更新)

    但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。 在C/C++中,"if (i == 1)"判断条件成立,是以0与非0为基准的,0表示false,非0表示true,如果有这么一段代码: ? remove掉 如果一个集合是公用的(也就是说不是方法里面的属性),那么这个集合里面的元素是不会自动释放的,因为始终有引用指向它们。 1混淆,这个点非常细节,值得注意 (39)所有重写的方法必须保留@Override注解 这么做有三个原因: (1)清楚地可以知道这个方法由父继承而来 (2)getObject()和get0bject( (44)静态、单例、工厂将它们的构造函数置为private 这是因为静态、单例、工厂这种类本来我们就不需要外部将它们new出来,将构造函数置为private之后,保证了这些不会产生实例对象

    34430

    Java 代码优化之细节是魔鬼

    但是,注意,像 HashMap 这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个 table 上只连接一个对象的可能性几乎为 0。 在C/C++中,"if (i == 1)"判断条件成立,是以 0 与非 0 为基准的,0 表示 alse,非0表示 true,如果有这么一段代码: int i = 2; if (i == 1) { ... } else { ... } C/C++判断"i==1"不成立,所以以0表示,即false。 1混淆,这个点非常细节,值得注意 (39)所有重写的方法必须保留 @Override 注解 这么做有三个原因: (1)清楚地可以知道这个方法由父继承而来 (2)getObject() 和 get0bject (44)静态、单例、工厂将它们的构造函数置为 private 这是因为静态、单例、工厂这种类本来我们就不需要外部将它们 new 出来,将构造函数置为 private 之后,保证了这些不会产生实例对象

    20020

    相关产品

    • 文本审核

      文本审核

      文本审核(Text Auditing Service,TAS)基于腾讯云天御业务安全防护为用户提供文本内容安全智能识别服务。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券