Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78854
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-02 16:15
文章分类
文章存档

2016年(24)

我的朋友

分类: LINUX

2016-04-29 17:36:19

原文地址:siizeof和内存对齐 作者:lwp225

 这段代码是我今天在一本书上看到的,很全面,贴出来和大家共享一下,  我做了些小改动,具体如下:
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. typedef struct{
  5.     short a1;
  6.     int a2;
  7.     char a3;
  8. }A;
  9. typedef struct {
  10.     int a1;
  11.     short a2;
  12.     char a3;
  13. }B;
  14. typedef struct {
  15.     B a1;
  16.     short a2;
  17.     char a3;
  18. }C;

  19. int main()
  20. {
  21.  char* ss1 = "0123456789";
  22.  char ss2[] = "0123456789";
  23.  char ss3[100] = "0123456789";
  24.  int ss4[100];
  25.  char q1[] = "abc";
  26.  char q2[] = "a\n";
  27.  char *str1 = (char *)malloc(100);
  28.  printf("%ld ",sizeof(ss1));
  29.  printf("%ld ",sizeof(ss2));
  30.  printf("%ld ",sizeof(ss3));
  31.  printf("%ld ",sizeof(ss4));
  32.  printf("%ld ",sizeof(q0));
  33.  printf("%ld ",sizeof(q2));
  34.  printf("%ld ",sizeof(str1));
  35.  printf("%ld ",sizeof(A));
  36.  printf("%ld ",sizeof(B));
  37.  printf("%ld \n",sizeof(C));
  38.  return 0;
  39. }
运行结果如下:


  1. lwp@linux:~/c++$ ./size_of
  2. 8  11  100  400  4  3  8  12  8  12
  1.ss1是一个字符指针,指针的大小是一个定值,不管哪种类型,在32位机子下是4字节,64位机子上是8位。因为我的是64位,所以是8.在ubuntu下可以用命令uname -a 查看。
  2.ss2是一个数组,这个数组未指定大小,由具体填充值来定。填充值是“0123456789”,再加上隐含的“\0”,所以是11个字节。
  3.ss3是一个字符数组,这个数组指定大小为100,所以他的大小是100字节.
  4. ss4是一个整型数组,这个数组指定大小为100,每个整型变量所占空间是4,所以他的大小是100x4=400字节.
  5. q1与ss2类似,所以是3+1=4字节。
  6.q2里面含有一个"\n","\n"算作一位,所以它的空间大小是3字节。
  7.str1与ss1类似,都是指针,所以为8字节。
  8.A、B、C是三个结构体。
在默认的情况下,为了方便对结构体内元素的访问和管理当结构体内元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。
  9.结构体A中最长数据元素为int型,每个整型变量所占空间是4,所以以4字节对齐,结果为12字节。
 10.结构体B中最长数据元素也为int型,所以以4字节对齐,首先给a1分配4个字节,给a2和a3分配时没有必要各自分配四个字节,只要合起来个字节就够了,所以答案为8字节。
 11. 结构体C中最长数据元素为shortt型,每个short变量所占空间是2,所以以2字节对齐,所以答案为8+2+2=12.


阅读(1329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~