展开

关键词

C++ 命名标准

13750

C++ 和复合类型

前面说了C++的基本数据类型,下面来看看在C++中如何定义和常定义和初始化C++定义的方式和C语言一样,也可以在定义的同时初始化。 值得一提的是列表初始化,在原来的C++版本中可以用于初始化数组等。C++ 11标准增加了更广泛的列表初始化,所以可以用列表初始化来初始化单个。 定义int a;定义并初始化int b = 1;同时定义多个int c = 5, d = 6;C++ 11 新特性:列表初始化int e{3};列表初始化有一个限制,如果要初始化的值超过了可容纳的范围 对于全局,如果没有给定初始值,默认值是0。定义和声明定义告诉编译器,我要创建一个,以后再用它。而声明告诉编译器,我要引用一个,所以你先按照这个的类型和名字去找它。 如果有一个全局,然后在某个作用域中又定义了一个同名,那么这个局部就会屏蔽对全局的访问。如果希望访问全局,需要使用域操作符::来指定。

433100
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年38元,还有多款热门云产品满足您的上云需求

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

    漫谈C——对齐(3)

    【正文】----  前面的两篇文章,我们分别介绍了“为什么要对齐到它的尺寸大小”,“编译器会怎么处理内存的对齐问题”以及“非对齐是如何产生的和非对齐的后果”,感觉自己错过了重要内容的朋友可以发送关键字 结构体内部,成员的排列顺序严格按照定义的顺序进行结构体内部,成员自动对齐到自己的大小——这就会导致空隙的产生。 比如: struct { uint8_t a; uint16_t b; uint8_t c; uint32_t d;} Example;? 结构体内部,成员可以单独指定对齐方式为byte,例如 struct { uint8_t a; uint16_t b __attribute__ ((packed)); uint8_t c; uint32 _t d;} Example;效果就会成:?

    15720

    漫谈C——对齐 (2)

    实际上,从ANSI-C的标准来看,这个代码并没有任何问题,语法和逻辑上都讲得通。但是对齐是一个“潜规则”,你不遵守它,就会吃亏。 如果操作的目标地址上是一个“易失性”的寄存器,那么非对齐的操作被拆分了以后,会导致原本的一次操作成了连续的两次。从而对操作的内容产生破坏性的后果。 ----注意:这里“易失性”意思就是,每次操作的时候:要么操作本身会导致寄存器内容改比如,GPIO的Toggle寄存器,每次写操作都会导致对应的引脚翻转比如,外设的中断状态寄存器,读取状态寄存器的操作本身就会清除标志 ……要么每次读取的内容都会不同比如, Timer计数器,每次读取的时候计数器的内容都不同比如,ADC的采样结果寄存器,读取顺序不同,很可能每次读取时候的值都会化……----如果操作的目标地址由多个Processor

    21120

    漫谈C——对齐 (1)

    ----将uint8_t对齐到……好吧,byte没啥好对齐的,它已经是C语言的最小单位了——你可以认为对齐到字节(Byte Aligned)也就是对齐到任意地址。 那么为啥处理器要根据的地址把访问活生生的拆成对齐和非对齐两类呢? 于是我们就看到了以下的情况:  已知在一个C文件中,我们定义了四个全局:uint8_t a;uint16_t b;uint8_t c;uint32_t d;你觉得编译器最终生成的排布(Layout 等一等,编译器从来没有给你保证过,你声明的顺序就是它Layout的顺序哦,所以,实际上,真正的Layout是下面的形式:? 你看,通过改的顺序,编译器成功的替我们节省了不少的存储器空间。

    19710

    漫谈C——优化天敌“volatile”

    【正文】----在前面的文章《编译器玄学报告第一期》中,我们了解到:volatile实际上是告诉编译器“绝不允许对被修饰的动手动脚(做优化)”,因为在“编译器不知道的情况下”,这个的值是可能会因为各种原因被更新或者是改的 实际使用中,volatile 阻断了编译器利用通用寄存器对静态的操作进行优化,虽然能保证操作的正确性,却无法在某些可以优化的地方提升性能。

    13430

    C++与指针 | 用string复制

    C++什么是指针 在C++代码中一般是通过名来对内存单元进行存取操作的,程序经过编译以后已经将名转换为的地址,对值的存取都是通过地址进行的。 按地址存取值的方式称为直接存取方式,或直接访问方式。 在C++中,还可以采用另一种称为间接存取的方式,可以在程序中定义这样一种特殊的,专门用来存放地址,由于通过地址能找到所需的单元,因此可以说,地址指向该单元。 因此将地址形象化地称为指针,一个的地址称为该的指针;如果有一个是专门用来存放另一地址的,则它称为指针;指针的值是地址。 C++指针 指针是一种特殊的,用它来指向另一个。为了表示指针和它所指向的之间的联系,在C++中用:*表示指向。经典案例:C++实现用string复制。

    1302220

    C++的引用 | 使用的引用

    C++的引用 C++可以对一个数据可以使用引用,引用是C++对C语言的一个重要扩充,引用是一种新的类型, 它的作用是为一个起一个别名。 声明change是temp的引用,可以理解为:使change具有temp的地址。 在C++中,声明一个引用类型时,必须同时使之初始化,即声明它代表哪一个,在声明change是temp的引用后,在它们所在函数执行期间,该引用类型change始终与其代表的temp 相联系,不能再作 为其他的引用。 经典案例:C++使用的引用。

    1972219

    java与C++初始化的对比

    java尽力保证:所有在使用前都能得到恰当的初始化 ①函数方法局部的初始化在CC++中,的初始化还是得依赖于程序员的自觉性。 而在java中,对于方法的局部,java以编译时错误来保证在使用前都能得到恰当的初始化。 void f(){ int i ; i ++ ; Error- - i not initialized}尽管java编译器也可以为方法的局部赋予一个初值,但局部未初始化更有可能是程序员的疏忽,采用默认值反而会掩盖这种错误 java尽力保证:所有在使用前都能得到恰当的初始化(《java编程思想》) java在初始化上,普通以编译错误、成员以默认初始化等手段,尽力使所有的在使用前都可得到初始化,在安全性上大大强于 C++。?

    35330

    漫谈C——夏虫不可语冰

    C语言中,按照生命周期来分,只有两类:静态和动态。 其中,静态是指,在编译时刻(Compiling-time)的地址和大小都已经确定下来的。 还有一类头顶上没有花括号,但是由static修饰的静态,我们称为“模块内全局”——它仅在当前.c文件内是可以“全局”访问的。   > 动态 C语言原生态支持的动态就只有局部了(Local Variable)。 ,堆的生存时间不受花括号限制,但正常情况下都是有限的,指不定什么时候就被Free掉了;少数比较悲惨的堆则滑落到了命运的深渊中,从此被人们所遗忘,陷入了痛苦的永生…… 堆不是C语言原生态所支持的类型 (C++、Java、C#原生态支持),而是开发人员通过程序逻辑所构造出的特殊类型。

    14420

    C++总结束 | 输出各种的值

    C++register寄存器 除了数据类型以外,还有3种属性:  存储类别,C++允许使用auto,static,register和extern4种存储类别。 局部 自动,,即动态局部 动态局部 寄存器 形式参数 全局 静态外部 外部存储期来区分,有动态存储和静态存储两种类型 动态存储  自动 寄存器 形式参数  静态存储 静态局部 静态外部 外部值存放的位置来区分,可分为  内存中静态存储区  静态局部 静态外部 外部 内存中动态存储区,自动和形式参数 。 C++中一个函数一般由:声明部分、执行语句两部分组成,声明部分的作用是对有关的标识符的属性进行说明,对于函数,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是函数功能的确立。 对而言,声明与定义的关系稍微复杂一些。在声明部分出现的有两种情况:一种是需要建立存储空间的;另一种是不需要建立存储空间的。 经典案例:C++输出各种

    782828

    C++前面加下划线的含义

    交流、咨询,有疑问欢迎添加QQ 2125364717,一起交流、一起发现问题、一起进步啊,哈哈哈哈哈 C++前面加下划线和不加下划线都不会影响对的定义,只是风格问题,更喜欢将成员或者私有成员的前面加上下划线 以表示该是某个类的属性。

    34920

    C++】static 详解-

    static修饰的话,有两点要注意。1.的存储区域在全局区,不管是在函数体内,class内,还是cpp文件内。2.的作用域在离它最近的{}内部,出了{}之外,不可以使用。 为了比较区别,在这里名都是a,发现都可以编译通过。这也就表明G++做了处理,可以区分出来不同作用域里面的。为了进一步知道原因,我编译出来了汇编,命令G++ -S *.cpp。汇编代码如下:? 从上到下,我们可以看到,不同函数内的static int a;会在前加上对应的函数名,例如:1.main函数里面的,成了_ZZ4mainE1a;2.Fun函数内的,成了_ZZ4FunvE1a ;3.全局的,成了_ZE1a;(这里没有粘贴出来,后续补上。) 经过编译器的处理之后,这些源代码中相同名字的,在编译之后便成了唯一的标识符,这也就说明了static作用域的意义了。----

    21310

    ❤️ C++的深度讲解,建议收藏❤️

    C++ 是存储数据值的容器。 在 C++ 中,有不同类型的(用不同的关键字定义),例如:int - 存储整数(整数),不带小数,例如 456 或 -456double - 存储带小数的浮点数,例如 99.99 或 -99.99char 字符串值用双引号括起来bool - 存储具有两种状态的值:真或假要创建,您必须指定类型并为其赋值 语法为:type variable = value;其中type是 C++ 类型之一(例如int), 而 variable是的名称(例如x或 myName)。 等号用于将值分配给。比如要创建一个应该存储数字的例子如下:#include using namespace std; int main() { int myNum = 18; cout

    6940

    C++的存储说明符和cv-限定符

    C++中创建时,前面有时会有一些修饰符,这里总结一下。大体分为两个类别:存储说明符和cv-限定符。 存储说明符存储说明符有下面这些:autoregisterstaticexternmutableauto修饰符的时自动,如果没有任何修饰符,默认就是自动,其作用域在函数内部。 register修饰将创建一个寄存器,理念在于CPU访问寄存器中的值比访问普通存储在堆栈中的值速度要快,声明方法:register int count_fast;需要注意的是,编译器并不一定会满足将放在寄存器中的要求 static修饰静态。 要注意静态使用范围:int global = 1000; 在函数外声明,文件内外皆可使用 此时如果其他文件还想创建global同名,要么用extern声明(此时用的还是同一个,共享了),要么用

    5610

    漫谈C——天然原子性是怎么回事?

    以32位机为例,对于图1所示的情形,由于32位数据的地址并未对齐到字,内核会将针对该数据的读写拆解成四个步骤:1)针对的第一个字节(8位)发起一个8位的读取;2)针对的第二和第三个字节发起一个16 位的读取(它们正好对齐到了半字);3)针对的最后一个字节发起一个8位的读取;4)最后将三次获得的结果合并成一个完整的32位数据——针对该的操作由多个步骤构成,且中途有可能被打断,因而不具备原子性 基于同样的原因,很多编译器为了提高内核的访问效率,在默认情况下,对结构体的采取了同样的策略——每个成员的地址都各自对齐到了与自己类型相同大小的位置上(如图2所示)——具体内容可以通过阅读《漫谈C 比如Cortex-M的ALU不光对32位的整型的访问具有原子性,对16位甚至是8位的访问也具有原子性。事实上,这一特性对很多8位机、16位机和64位机都一样适用。 那么,是不是一个拥有了“天然原子性”,当多个任务都要对其发起访问时,我们就可以高枕无忧了呢?答案是否定的。关于这一点,我们将在下篇文章中把每一种情况都列举出来——详细的为您分析和展开。

    26520

    C++的存储类别 | 判断是否是闰年

    C++静态存储方式 在上一节小林讲过,作用域从空间的角度来分析的,分为全局和局部,在这一节中,小林带着你学习的另一种属性,在内存中的存在期间,也就是存储期。  存储期可以分为静态存储期和动态存储期,静态存储方式是指在程序运行期间,系统对分配固定的存储空间;动态存储方式则是在程序运行期间,系统对动态地分配存储空间。  C++动态存储方式 动态存储区中存放以下数据: 函数形式参数,在调用函数时给形参分配存储空间。 函数中的自动。 函数调用时的现场保护和返回地址。 在C++中还有存储类别的属性,具体包含4种: 自动auto 静态static 寄存器registe 外部extern 根据的存储类别,可以知道的作用域和存储期。 经典案例:C++实现判断闰年。

    1412828

    c++临时

    C++临时“有时候,在求表达式的期间,编译器必须创建临时(temporary object)。像其它任何对象一样,它们需要存储空间,并且必须能够构造和销毁。 需要注意的是,编译器创建的这个临时为常.” – Thinking in C++什么情况下编译器会创建临时看下面代码:class A{public: print(){ cout

    30960

    C++基础

    的基本形式是:首先是类型说明符,随后紧跟有一个或者多个的名组成的列表,其中含有多个名时用逗号隔开,最后以分号结束。 int sum = 0;string first_name,last_name;命名规范: (1)名称一般用小写字母 (2)自定义的类名一般首字母大写 (3)如果名由多个单词组成,则单词之间最好有明显区分引用引用是为对象起了另外一个名字 Student student(baxiang,26); Student &refStudent = student; student.show(); refStudent.show();声明为引用的必须初始化 string name = test; string &rName = name; string &othName = rName;指针与引用类似,指针也同样实现了对其他对象的一个间接访问,定义指针的方式是在前面在上星号

    14810

    C++ Json 的初始化

    参考链接: C++ : List的不同初始化方法1、从字符串 解析        view plain    copy   int ParseJsonFromString()   {     const ();         }       }     }     is.close();     return 0;   }    3、在json结构中插入json  json中的数组,我一开始理解成跟c+ +中List,都是用下标去访问,但是这个中间有个问题:比如谁一个json的数字a,你要获取第一个数组中的元素给b,不能直接用b=a,而是得先定义一个int i=0;b=a,不然编译的时候会报错,不知道这是为什么

    25920

    扫码关注云+社区

    领取腾讯云代金券