C++学习之路(一):const与define,结构体对齐,new/delete
前言:针对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的更多相关文章
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- const与#define、结构体对齐、函数重载name mangling、new/delete 等
一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result ...
- [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...
- [c/c++] programming之路(26)、结构体
一.初始化字符串 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...
- go培训课程都学什么?xorm框架学习系列(二):xorm结构体映射规则和表操作
上节内容我们学习了基本的xorm框架的知识和基础配置的相关信息.本节课内容我们继续学习相关的知识和相关操作. 名称映射规则 名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射. ...
- go 学习 (三):函数 & 指针 & 结构体
一.函数 函数声明 // 声明语法 func funcName (paramName paramType, ...) (returnType, returnType...) { // do somet ...
- Python3学习之路~4.4 软件目录结构规范
为什么要设计好目录结构? 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织 ...
- Android开发学习之路--Android Studio项目目录结构简介
既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...
- Labview学习之路(六)条件结构
条件结构位于 函数---结构 子选版中.相当于c语言的switch语句, 结构: 分支选择器 分支器标签 分支子框图 可接数据类型 布尔型 布尔常量 真和假 错误信息簇 真和假 整型数值 单值 可 ...
随机推荐
- Visual Studio 2013中使用Ribbon For WPF
1.首先需要 下载Ribbon For WPF.目前最新的版本是Microsoft Ribbon for WPF October 2010. 下载 链接: https://www.microsoft. ...
- P4035 [JSOI2008]球形空间产生器
题目描述 有一个球形空间产生器能够在 nn 维空间中产生一个坚硬的球体.现在,你被困在了这个 nn 维球体中,你只知道球面上 n+1n+1 个点的坐标,你需要以最快的速度确定这个 nn 维球体的球心坐 ...
- 51nod 1304 字符串的相似度(exkmp)
拓展kmp裸题 自己跟自己匹配即可 模板测试=v= #include <iostream> #include <cstring> using namespace std; ; ...
- BZOJ3864 & HDU4899:Hero meet devil——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3864 http://acm.hdu.edu.cn/showproblem.php?pid=4899 ...
- CF527A:Playing with Paper——题解
https://vjudge.net/problem/CodeForces-527A http://codeforces.com/problemset/problem/527/A 题目大意:一个纸长a ...
- nxlog以syslog方式发送日志
1.nxlog简介 nxlog是个跨平台日志传输插件,支持linux.windows平台,支持window及linux内置的大部分系统日志及常见的web日志,支持tcp.udp.http(s)等协议传 ...
- YBT 5.3 数位动态规划
记忆化搜索的专题 题解在代码中 Amount of Degrees[loj 10163] /* 此题可以转换成将10进制转成b进制后有k个1其他都为0的个数 所以用记忆化dfs dp[pos][sum ...
- Nginx配置解析
#运行用户,默认即是nginx,可不设置 #user nobody; #nginx进程,一般设置为和cpu核数一样 worker_processes 1; #;单个后台worker process进程 ...
- Ubuntu 16.04使用python3.x相关
下载pip3 Python 3.x版本使用pip3,它会把你想下载的包放到usr/local/lib/python3.5/dist-packages/下,而非usr/local/lib/python2 ...
- Confluence代码块(Code Block)宏
有时候现在wiki上插入代码,如何让代码高亮,变的有颜色,下面这篇文章可能会帮助你,先看下django代码高亮效果图 代码块(Code Block)宏允许你在 Confluence 页面中显示代码,并 ...