一、数据对齐存储

在32位系统中:int占4Bytes,short占2Bytes,char占1Byte,加起来应该是7Bytes,但是下面这段代码输出却是8。

 #define _CRT_SECURE_NO_WARNINGS

 #include <iostream>
#include <cstdio> using namespace std; struct Node {
int x;
short y;
char c;
}; int main()
{
printf("%d\n", sizeof(Node)); return ;
}

计算机对于基本类型数据在内存中的存储位置有些限制,即内存对齐

处理器取数据一般不按照单个字节,而是双字节、四字节等进行,假设这种存取粒度为4Bytes,也就是说处理器只能从首地址为4的倍数的地址读取数据。如果没有对齐存储,取数据会很麻烦,可能需要两次读取并且剔除掉无用的字节。

每个编译器都有默认的对齐模数,那么有效对齐值=min{对齐模数,结构体中最长数据类型长度}。

规则1:第一个成员offset为0,其后成员的offset=min{有效对齐值,该类型字节数};

规则2:结构体总大小必须为有效对齐值的整数倍,否则编译器会自动填充。

再看前面的例子,int占0~3,short占4~5,char占6,总长度为7,不是4的整数倍,所以地址7是填充字节,共8Bytes。

二、栈&堆(不是数据结构中的栈和堆)

1、内存栈区

编译器自动进行分配和释放,存放局部变量、函数的参数等。

Windows下栈向低地址扩展,大小只有几MB,如果开一个很大的局部数组,就会提示stack overflow。

2、内存堆区

malloc或者new返回的内存区域,使用完需要用户free或delete,否则容易内存泄漏。如果程序员不释放,那么结束时由操作系统回收。

堆向高地址扩展,由于系统采用空闲链表存储空闲内存,所以是不连续的。系统在收到内存申请的请求后,会由低地址向高地址遍历空闲链表,找到第一个满足的空闲块,删除该结点,并将该块的首地址返回。如果分配的空间大于申请的,会将剩余部分重新链接回空闲链表。

 //在Heap中开辟10Bytes,同时在Stack中压入p,p的值为10Bytes的首地址
char* p = new char[];

3、常数区

存放字符串常量等,程序结束由系统回收。

4、静态区

存放全局变量或者静态变量,初始化的和没有初始化的分别存放在不同的区域,程序结束后由系统释放。

5、代码区

存放程序代码。

三、其它

排序复杂度、人工智能概念、模型的建立等。

最新文章

  1. Angular2 Hello World 之 2.0.0-beta.14
  2. 简谈asp.net下的异步加载
  3. CoreLocation定位技术
  4. 使用 sqlcmd 运行 Transact-SQL 脚本文件
  5. Python类
  6. WampServer phpadmin apache You don&#39;t have permission to access
  7. loj 1221(spfa判正环)
  8. 毕老师的Editplus
  9. mysql查看日志
  10. select、poll、epoll用法
  11. JAVASCRIPT 调用 其他应用程序的方法
  12. Excel中choose函数的使用方法
  13. uni-app实现顶部导航栏显示按钮+搜索框
  14. sql server数据库文件的迁移(mdf&amp;ldf文件)
  15. .NET Core2.0 使用EF做数据操作
  16. PostgreSQL索引页
  17. create a cocos2d-x-3.0 project in Xcode
  18. jQuery内部原理和实现方式浅析
  19. Qt5_QString_测试
  20. [转帖]Cgroups 与 Systemd

热门文章

  1. 【python】利用jieba中文分词进行词频统计
  2. MySQL学习之路5-数据表的常用操作
  3. 利用Ajax实现异步请求
  4. Alpha-release 总结
  5. work of 1/4/2016
  6. E. Max Gcd
  7. Spring5:概念
  8. Spring Cloud 系列之 Sleuth 链路追踪(一)
  9. 算法笔记刷题1(codeup 1934)
  10. Deepin15.11-mysql5.7安装与配置