C++备忘录

类的大小

  • 空类(不含成员变量和虚函数):因为对象不可能不占内存,否则这个对象怎么存在,所以C++规定空类对象内存大小为1。

    class EC
    {
    public:
    	EC(){}
    	~EC(){};
    	void EC1()
    	{
    		printf("EC1\n");
    	}
    };
    
    class EVC
    {
    public:
    	EVC(){}
    	~EVC(){};
    	void EVC1()
    	{
    		printf("EVC1\n");
    	}
    	virtual void VEVC1()
    	{
    		printf("EVC1\n");
    	}
    };
    
    int main(int argc, char*argv[])
    {
    	printf("%d\n", sizeof(EC));
    	printf("%d\n", sizeof(EVC));
    }

    输出结果:

    1
    4
  • 虚类(包含虚函数的类):因为声明虚函数后,类需要管理虚函数,所以创建了虚函数指针,所以类的对象大小还要计算这个虚表指针的大小。
  • 普通类:一般考虑像C的结构体那样即可(考虑数据对齐)。

函数调用方式

  • _cdecl : C\C++的默认调用方式,函数调用负责管理函数调用堆栈,支持不定参数。
  • _stdcall : WINAPI的调用方式,函数本身负责管理函数调用堆栈,不支持不定参数。
  • _fastcall : 寄存器方式传参,函数本身负责管理函数调用堆栈,不支持不定参数,VC默认在参数个数小于等于3的情况下使用这种方式。
    ;--- e:\code\win32\dre\helloworld\main.cpp --------------------------------------
    #include <stdio.h>
    
    int _cdecl Test(int a, int b)
    {
    009E13A0  push        ebp
    009E13A1  mov         ebp,esp
    009E13A3  sub         esp,0C0h
    009E13A9  push        ebx
    009E13AA  push        esi
    009E13AB  push        edi
    009E13AC  lea         edi,[ebp-0C0h]
    009E13B2  mov         ecx,30h
    009E13B7  mov         eax,0CCCCCCCCh
    009E13BC  rep stos    dword ptr es:[edi]
    	return a+b;
    009E13BE  mov         eax,dword ptr [a]
    009E13C1  add         eax,dword ptr [b]
    }
    009E13C4  pop         edi
    009E13C5  pop         esi
    009E13C6  pop         ebx
    009E13C7  mov         esp,ebp
    009E13C9  pop         ebp
    009E13CA  ret								;无平衡堆栈,这类调用方式不用处理函数堆栈帧
    ;--- 无源文件 -----------------------------------------------------------------------
    
    ;--- e:\code\win32\dre\helloworld\main.cpp --------------------------------------
    
    int _stdcall Test1(int a, int b)
    {
    009E13F0  push        ebp
    009E13F1  mov         ebp,esp
    009E13F3  sub         esp,0C0h
    009E13F9  push        ebx
    009E13FA  push        esi
    009E13FB  push        edi
    009E13FC  lea         edi,[ebp-0C0h]
    009E1402  mov         ecx,30h
    009E1407  mov         eax,0CCCCCCCCh
    009E140C  rep stos    dword ptr es:[edi]
    	return a+b;
    009E140E  mov         eax,dword ptr [a]
    009E1411  add         eax,dword ptr [b]
    }
    009E1414  pop         edi
    009E1415  pop         esi
    009E1416  pop         ebx
    009E1417  mov         esp,ebp
    009E1419  pop         ebp
    009E141A  ret         8						;平衡堆栈,这类调用方式需要处理函数堆栈帧
    ;--- 无源文件 -----------------------------------------------------------------------
    ;main
    ;{
    
    	Test(1,2);
    009E145E  push        2
    009E1460  push        1
    009E1462  call        Test (9E100Ah)
    009E1467  add         esp,8					;平衡堆栈,调用者需要处理函数堆栈帧
    	Test1(1,2);
    009E146A  push        2
    009E146C  push        1
    009E146E  call        Test1 (9E107Dh)		;无平衡堆栈,被调用者已处理函数堆栈帧
    
    ;}

静态局部变量初始化

问:C\C++中如何实现静态变量多次调用但是只初始化一次 呢?

答:一定有方法的,编程语言能搞定他的!

问:到底是啥呢?

答:....

其实,如果不是看到相关的问题或者资料,这个问题想得人还真不多。其实这个问题实现的方法也简单,弄一个东西记录该静态变量是否初始化即可,编译器的一般做法是选取该变量附近的一个字节来记录该静态变量是否初始化了,但是因为记录该状态只需要一个Bit即可,而一字节有8Bit,所以这个字节可以被其他静态变量共享使用的。

	static int nSa = a;
000C143E  mov         eax,dword ptr [$S1 (0C713Ch)]  	; ===========BEG==============
000C1443  and         eax,1
000C1446  jne         TestStaticVar+3Dh (0C145Dh)
000C1448  mov         eax,dword ptr [$S1 (0C713Ch)]
000C144D  or          eax,1  							; ===========END==============
000C1450  mov         dword ptr [$S1 (0C713Ch)],eax
000C1455  mov         eax,dword ptr [a]
000C1458  mov         dword ptr [nSa (0C7138h)],eax  

BEG到END部分的代码就是用来判断该静态变量是否已经初始化了的,此处用的是该字节的最低一个BIT

C++备忘录

时间: 2024-09-30 11:07:44

C++备忘录的相关文章

Java设计模式应用——备忘录模式

备忘录模式主要用于存档.游戏中我们打boss前总会存档,如果打boss失败,则读取存档,重新挑战boss. 可以看出来,备忘录模式一般包括如下数据结构 1. 存档文件:用于恢复备份场景的必要数据: 2. 存档管理器:用于管理存档,包括存档的读写与展示: 3. 被存档的对象. 下面以射击游戏的存档来举例: 1. 射击选手 package com.coshaho.learn.memorandum; // 射击手 public class Shooter { // 血量 private int blo

Swift备忘录

Swift 备忘录 2015-4 一.简介 1.Swift 语言由苹果公司在2010年7月开始设计,在 2014 年6月推出,在 2015 年 12 月 3 日开源 2.特点(官方): (1)苹果宣称 Swift 的特点是:快速.现代.安全.互动,而且明显优于 Objective-C 语言 (2)可以使用现有的 Cocoa 和 Cocoa Touch 框架 (3)Swift 取消了 Objective-C 的指针及其他不安全访问的使用 (4)舍弃 Objective-C 早期应用 Smallta

JAVA设计模式(20):行为型-备忘录模式(Memento)

场景 录入大批人员资料.正在录入当前人资料时,发现上一个人录错了,此时需要恢复上一个人的资料,再进行修改. word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word提示恢复到以前的文档. 管理系统中,公文撤回功能.公文发出去后,想撤回来. 核心 就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态. 结构 源发器类Originator 备忘录类Memento 负责人类CateTaker 开发中常见的应用场景 棋类游戏中的,悔棋 普通软件中的,撤销操作 数据库软件中的,

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

Linux中tomcat开机启动配置脚本【参考其他文章的总结备忘录】

参考文章http://blog.sina.com.cn/s/blog_a57562c80101ic47.html http://blog.csdn.net/cheng168520/article/details/4312828 http://blog.sina.com.cn/s/blog_7f395ece0100ti5y.html 以前在自己本机上安装过一个Linux,后台应为系统崩溃,以前配置的开机启动脚本.数据库主从双备份.负载均衡等都没了,所以现在在重新配置一次,赶紧做个笔记防止自己以后又

4 行为型模式之- 备忘录模式

备忘录模式介绍: 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的"后悔"药.备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外界访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露 备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将对象恢复到原先的状态 对于备忘录模式来说,比较贴切的场景应该是游戏中的存档功能,该功能就是将游戏进度存储到

Ubuntu 14.04 安装配置备忘录

完全在 Linux 下工作,大概有3年时间了. 之前都是用 Windows, 而把 Linux 装在虚拟机里,现在反过来,把 Windows 装在了虚拟机里,只是因为偶尔还要用网银的缘故. 以我这几年的使用经验, 一句话: Linux 用过之后就回不去了. 以下记录我的 Ubuntu 14.04 Linux 安装配置, 算是备忘录. 需要说明的一点是: 我从来不觉得使用 Debian, CentOS, 或者 Arch, Gentoo 的人很牛, 只能说明你们不珍惜时间,就爱瞎折腾, 当然如果你是

设计模式03备忘录(java)

先贴代码有空来写内容. 备忘录1 1 //简单的备忘录,只可以记录上一次修改前的状态,实现撤回一次的操作. 2 class Student{ 3 private String name; 4 private String age; 5 private String gender; 6 //在Student类中直接设立一个Student实例,用于存储该类对象的上一个状态 7 private Student memento=null; 8 //构造函数就不啰嗦了 9 public Student()

备忘录模式

备忘录模式,望文生义就知道它是用来做备忘的,或者可以直接说是“备份”.当需要保存当前状态,以便在不久要恢复此状态时,就可以使用“备忘录模式”.将当前”状态“备份,是不是又new一个类,然后将每个字段方法copy过去就可以了呢?或者说使用我们之前clone方法做深复制浅复制呢?其实不然,在<大话设计模式>中,作者提到了原因,这样会暴露更多的细节给客户端,不符合我们面向对象的思想.什么是暴露更多的细节给客户端?我们来看下面一段代码. 1 package day_27_memento; 2 3 /*

设计模式(12)---备忘录模式

备忘录模式   Memento (行为型模式) 1.概述 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 例如:一些软件提供的撤销功能,游戏的存档读档功能. 2.结构图 3.代码 1 /* 2 * 原发器类 Originator 3 */ 4 public class Role { 5 6 private int level ; 7 private int life ; 8 9 public Role() { 10