1. c++提供了太多的存储对象的方式: 堆 栈 全局数据区 2. c++ 提供了太多的访问对象的方式: 变量 指针 引用 这样, 对于对象的操作就有9种不同的组合了, 所以c++显得比较复杂. 所以想灵活熟练的使用c++, 就得对上面所述的9中对象的操作了如指掌才可以.原文:http://www.cnblogs.com/ApopToxin0723/p/4004119.html
#include "stdio.h"
#include "stdlib.h"
#include "string.h"void main()
{int i = 0, j = 0;char buf[100];char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10]if (myarray == NULL){return;}for (i=0; i<10; i++){myarray[i] = (char *)malloc(100*sizeof(char)); //char buf[100];if (myarray[i] == NULL){printf("ddddde\n");return;}sprintf(myarray[i],"%d%d%d ", i, i, i);}//第三种内存模型打印 print...
多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数。 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数。在每个包含有虚函数的类的对象的最前面(是指这个对象对象内存布局的最前面)都有一个称之为虚函数指针(vptr)的东西指向虚函数表(vtbl),这个虚函数表(这里仅讨论最简单的单一继承的情况,若果是多重继...
C++程序在执行时,将内存大方向划分为5个区域
程序运行之前:代码区 :存放函数体的二进制代码,由操作系统进行管理的存放CPU执行的机器指令 代码区是共享的,只读的 全局区(静态存储区) :存放已初始化的全局变量和静态变量以及常量(其实又分为字符串常量和全局常量)const修饰的全局变量放在全局区,const修饰的局部变量属于局部变量放在栈区中; 该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包含全局...
一、C++ 内存区域
C++ 内存分为 5 个区域:堆 heap :
由 new 分配的内存块,其释放编译器不去管,由程序员自己控制。如果程序员没有释放掉,在程序结束时系统会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”。
栈 stack :
是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。
全局/静态存储区 (...
1、存储区域
1)Heap堆
由malloc分配的内存块,由程序员控制内存块的申请和释放(malloc/free)。如果申请的堆内存没有被释放掉,在程序结束时操作系统会自动回收。涉及问题:缓冲区溢出、内存泄漏。
2)Free store 自由存储区
由new分配的内存块。由程序员控制内存块的申请和释放(new/delete)。如果申请的堆内存没有被释放掉,在程序结束时操作系统会自动回收。涉及问题:缓冲区溢出、内存泄漏。
3)stack 栈
由编译器负责分配和...
你也可以通过我的独立博客 —— www.huliujia.com 获取本篇文章内存乱序
内存乱序指的是内存操作出现乱序,CPU缓存、编译器优化、处理器指令优化等都会改变内存顺序,造成内存乱序。
学习内存顺序容易陷入了一个误区,因为内存顺序是和CPU架构、编译器息息相关的,想要去深入理解CPU缓存怎么导致内存乱序的,编译器优化和处理器指令又是怎么导致内存乱序的,很容易陷入一个又一个填不了的坑。要去了解各种编译器优化技术、了解各种...
虚函数内存模型
纯虚函数在有些情况下,在基类中不对虚函数给出有意义的实现,仅当做统一的变成接口来使用,它的实现留给该基类的派生类去做,这种称为纯虚函数纯虚函数相当于一个接口模板,一个类中如果定义了纯虚函数,则这个类被称为抽象类,C++规定抽象类不能直接实例化对象派生类继承父类的纯虚函数后,若给出了实例化对象就可以实例化,不然也不行。 1 #include<iostream>2 using namespace std;3 4 class Animal5 {6 public...
自动存储类型静态存储类型外部链接性内部链接性无链接性
动态存储类型??C++主要有三种存储类型:
自动存储类型:在函数定义中声明的变量(包括函数参数),他们在函数执行时被创建,在函数执行完毕后被释放。静态存储类型:在函数定义外定义的变量和使用关键字static定义的变量,它们在程序运行的整个过程中都存在。动态存储类型:用new运算符分配的内存将一直存在,知道delete将其释放或程序结束为止。
??从存储区域来看,三种类型分...
1. 存储说明符和cv-限定符auto
register
static
extern
mutable
const
volatile2. auto 自动变量。
3. register 寄存器变量。
4. static 静态变量,用于作用域为整个文件的声明时,表示内部连接性;用于局部声明时,便是局部变量的存储持续性为静态的。
5. extern 表明是引用声明,引用其他地方定义的变量。
6. mutable 指出即使结构体(或类)变量为 const,被关键词 mutable 修饰的成员也可以被修改。struct data{char name[30...
1、作用域和链接int num3;
static int num4;int main()
{
}void func1()
{static int num1;int num2;
}上边的代码中num1 和num2 只适用于func1,区别在于num1 在func1没有被调用时也存在于内存中。
num4 只适用于当前文件。
2、说明符和限定符
一个比较特殊的 mutable 。对于某些使用const变量被修改,例如struct node
{int num1;mutable int num2;
};const node n;n.num2++; //allow3、命令空间namespace element
{namespace f...
c++中的变量分类:
https://blog.csdn.net/u013921430/article/details/79279114
https://wenku.baidu.com/view/747cf817b307e87101f696aa.html
1、变量属性:数据类型:整型,浮点型
存储类别:静态,动态2、变量分类:空间:作用域(局部,全局)
时间:存储期(静态,动态)3、内存空间划分:静态存储区(全局变量,加static声明的局部变量)
动态存储区(函数形参,未加static声明的局部变量)静态存储区中的变量,在程序执行...
我们在编程的时候,无可避免要申明变量,在这个变量可以是在()中,可以在{}中,也可以直接在外面,也可以用new的方式.那么当我们在申明变量的时候,实质上我们所做的工作是:关联了一个内存模型!
上代码: 1 #include <iostream>2 #include <thread>3 #include <chrono>4 #include <mutex>5 # include<string>6 using namespace std;7 mutex mtx;8 void fn1()9 {
10 for (int i = 0; i < 5; i++)
11 {
12 unique_...
一、虚函数
1.虚函数表位置分析
类:有虚函数,这个类会产生一个虚函数表
类的对象:有一个指针(vptr)会指向类的虚函数表——虚函数表指针。(位置可能在类内存空间的开头,也可能在末尾,具体由编译器实现决定)
2.继承关系作用下虚函数的手工调用
拿到虚函数表的地址,通过定义函数指针并赋值的方式可以直接调用虚函数。子类的虚函数会覆盖父类的虚函数。
3.虚函数表分析
(1)一个类只有包含虚函数才会存...
一、对象
1.类对象所占用的空间
(1)类的普通成员函数不占用类对象的成员空间
(2)一个类对象至少要占用1字节的内存空间
(3)类的普通成员变量占用类对象的空间(每一个类的对象拥有属于自己的成员变量)
(4)类的普通成员函数虽然写在类的定义中,但普通成员函数不会占用类对象的内存空间
(5)所有类的对象公用一份成员函数