前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验。

(一)const与define

关于const与define的用法与比较,可以详见我之前的这篇文章,在这里就不再赘述了。

(二)结构体对齐

简单说一下为什么需要结构体对齐,或者说内存对齐。

在32位操作系统中,一次寻址能够取得的指令长度是4字节(也就是32位地址)。对于一个4字节变量来说,如果其存放的位置在正好在一个4字节中,那

对于操作系统而言,只需要一次访存就可以获得。如果其分存在两个4字节地址,则系统需要先进行一次访存取得前一块内存中的数据,再进行一次访存取得

后一块内存中的数据。显然这样带来的问题,即影响了程序运行的性能。

总结一下:

什么是内存对齐:

1)编译器为每个数据单元排在合适的内存地址上

为什么需要内存对齐:

1)提高性能

如何对齐:

1)第一个数据成员放在内存偏移量为0的地址;

2)接下来的数据成员放在4字节整数倍的地址;

3)如果是结构体,结构体整体也会进行内存对齐

给两个例子:

struct test1
{
char a;
int b;
char c;
} struct test2
{
char a;
char b;
int c;
} cout<<sizeof(test1)<<endl;
cout<<sizeof(test2)<<endl;

其中sizeof(test1)的结果为12,sizeof(test2)的结果为8,简单分析一下:对于test1来说,a占一个字节,接下来的b占4个字节,为了保证内存对齐,b需要一个完整的4字节大小内存,

一个示意图为(1表示占用,0表示未占用)

a: 1 0 0 0

b: 1 1 1 1

c: 1 0 0 0

整个结构体大小为12个字节。

再看test2,a占一个字节,b占一个字节,c占4个字节,在这种情况下,内存分配的示意图为

a,b : 1 1 0 0

c:     1 1 1 1

整个结构体大小为8个字节

总结一下:在结构体变量声明中,为减少内存开销,应该尽可能的将内存小的变量先定义,内存大的变量后定义。

(三)new和delete

(1)new/delete 与 malloc/free

new和delete是c++中的运算符,malloc和free是c中的库函数。它们的本质比较类似,从进程地址空间的堆区分配一块内存,返回内存首地址,但new和delete可以用于分配类对象的地址

空间,这个对于malloc和free来说不行。

(2)new 与 new [5]

int *p = new int(5);   //分配一个int对象,数据为5

int *q = new int[5];   //分配5个int对象

(3)delete 与 delete []

delete主要针对一个对象,将其内存进行释放。

delete []主要针对对象数组,将其数组内存进行释放。

注意:上述(2)中q,如果采用delete q,仅仅只会释放q[0]所在的内存区域,从而造成内存泄露,正确的方式应该采用delete []q;

C++学习之路(一):const与define,结构体对齐,new/delete的更多相关文章

  1. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

  2. const与#define、结构体对齐、函数重载name mangling、new/delete 等

    一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result ...

  3. [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝

    一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...

  4. [c/c++] programming之路(26)、结构体

    一.初始化字符串 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...

  5. go培训课程都学什么?xorm框架学习系列(二):xorm结构体映射规则和表操作

    上节内容我们学习了基本的xorm框架的知识和基础配置的相关信息.本节课内容我们继续学习相关的知识和相关操作. 名称映射规则 名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射. ...

  6. go 学习 (三):函数 & 指针 & 结构体

    一.函数 函数声明 // 声明语法 func funcName (paramName paramType, ...) (returnType, returnType...) { // do somet ...

  7. Python3学习之路~4.4 软件目录结构规范

    为什么要设计好目录结构? 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织 ...

  8. Android开发学习之路--Android Studio项目目录结构简介

    既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...

  9. Labview学习之路(六)条件结构

    条件结构位于 函数---结构 子选版中.相当于c语言的switch语句, 结构: 分支选择器 分支器标签 分支子框图 可接数据类型 布尔型 布尔常量 真和假   错误信息簇 真和假 整型数值 单值 可 ...

随机推荐

  1. [OS] 线程相关知识点

    操作系统中引入进程的目的,是为了描述和实现多个程序的并发执行,以改善资源利用率以及提高系统吞吐量.那为什么还需要引入线程呢?下面我们先来回顾一下什么是进程: 进程有两个基本属性:·资源的拥有者:给每个 ...

  2. BIO、NIO、AIO通信机制

    一.BIO的理解 首先我们通过通信模型图来熟悉下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端的连接请求之后为每个客户端创 ...

  3. js 关键字 in 判断 一个属性或方法是否属于一个对象

    判断对象是否为数组/对象的元素/属性: 格式:(变量 in 对象)......注意,,, 当“对象”为数组时,“变量”指的是数组的“索引”: 当“对象”为对象是,“变量”指的是对象的“属性”. 判断 ...

  4. 转:Scipy入门

    Scipy入门 转:http://notes.yeshiwei.com/scipy/getting_started.html 本章节主要内容来自 Getting Started .翻译的其中一部分,并 ...

  5. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$f_i=\sum_{j=1}^if_{i-j}g_j\\f_0=1$$ 题解:直接求复杂度是$O(n^ ...

  6. [Leetcode] valid palindrome 验证回文

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  7. 洛谷 P3959 宝藏 解题报告

    P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小 ...

  8. django 给前端传递HTML内容

    django从view向template传递HTML字符串的时候,django默认不渲染此HTML,原因是为了防止这段字符串里面有恶意攻击的代码. 如果需要渲染这段字符串,需要在view里这样写: f ...

  9. The Usage of Pymongo

    Install pymongo document install pymongo from the tar package download from website python setup.y i ...

  10. mybatis 根据id批量删除的两种方法

    原文:https://blog.csdn.net/qq_40010745/article/details/81032218 mybatis 根据id批量删除的两种方法   第一种,直接传递给mappe ...