zoukankan      html  css  js  c++  java
  • c/c++结构体中数据对齐

    最近看到了腾讯的一道笔试选择题,觉得很有意思,主要是涉及到数据对齐问题。

    下面代码在64位计算机上运行结果是多少?

     1 #include <stdio.h>
     2 #include <string.h>
     3 struct st_t {
     4     int status;
     5     short *pdata; //64位系统下指针占8个字节。 
     6     char errstr[32]; //需要考虑数据对齐 
     7 };
     8 
     9 int main(){
    10     st_t st[16],a;
    11     char *p=(char *)(st[2].errstr+32);
    12     //printf("%d
    ",sizeof(a));
    13     printf("%d",(p-(char *)(st)));
    14     return  0;
    15 }

      最后运行结果是144,通过第十二行出注释的打印语句我们可以知道结构体st_t的大小为48,和我们所想的不太一样,后来发现是数据对齐问题,在64位计算机上,地址是占8个字节,所以指针大小为8,这里要注意和编译器有一定的关系,在64位系统上,有的编译器编译环境还是32位,如vs2005,2010默认就是32位编译环境,即使在64系统上,此时得到的指针大小会是4。这里我们按照常规分析,题中已经说明运行在64位系统上,指针大小就是8位,这里我们就看结构体中数据,整型数据status大小为4个字节,指针pdata大小8个字节,char型数组errstr大小为32个字节,结构体中数据在进行存储的时候,在默认情况下为了便于对结构体内的元素进行访问和管理,当结构体内的元素都小于处理器的位数的时候,便会以结构体中最长的数据元素为对其单位,也就是说结构体的长度一定是最长的数据元素的整数倍。所以这里将以指针的大小为对其方式,所以整个结构体大小为8+8+32=48。

    数组st[16]中每个元素都是结构体类型,所以数组大小为16x48=768,指针p指向的内容涉及到二级指针,指向如下图所示:

    从图中我们可以非常清楚的看到指针p所指向的对象,而st是数组名指向的是机构体中的第一个元素,所以我们就可以计算出(p-(char *)(st)大小,也就是他们之间所隔元素占用的内存大小,即是48*2+8+8+32=144
    这里我想到了一个容易混淆的概念,即数组加1的区别。
    eg:int a[3],区分a+1,&a+1;a+1=a[1];&a+1=a[4],也就是偏移整个数组单位。

     本文为作者原创,转载请注明出处,谢谢!http://www.cnblogs.com/xiaodingmu/p/7420240.html 

     
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/xiaodingmu/p/7420240.html
Copyright © 2011-2022 走看看