菜鸟路--第一天

来源:互联网 发布:pc蛋蛋牛人算法2017 编辑:程序博客网 时间:2024/06/08 00:20

        因为前两天老师讲到了结构体在内在中的存储,因为走了一下神,没有搞清楚到底是怎么一回事,在心里一直有一个疑问,弄得自己很不爽,上次问过一个同学,结果他也没讲清楚,趁今天上午有时间就上网查了一下,再实验了,应该还算是弄清楚了一些皮毛吧。

         因为C在某些系统或者说编译器来说有着某些差异,所以还是编译环境有必要提一下:

                    32位linux 操作系统  (fedora13发行版)  ,gcc 编译器

          因为我之前听了老师讲了一点点的规则,结果我老是想着那三条规则:

1:结构体变量在内在中的首地址是能被结构体中最大成员所整除的地址(一定满足被4整除)

2:结构成成员在内在中相对于结构体首地址的偏移量能被该成员所占内存空间数所整除(windows)或者能被4整除(linux)

3:结构体变量所占用的内存空间数能够被结构体最大成员所占内存数所整除(WINDOWS)或者能被4整除(LINUX)

之后我一直想了很久,或许因为我本身就是个菜鸟,思维可能不是那么的给力啊。这第一条规则我能接受,可这第二条和第三条我却是怎么也接受不了,看着同学们个个是对答如流,我是真个搞不懂啊。因为本来就不懂,当我问同学的时候,我那同学就跟我说了个对齐的东东,因为可能他也不怎么知道,就混过去啦,我嘞,就又多了一个问题,什么叫对齐?

        今天上午没课,我就在网上查了相关的概念,LINUX C 中字符对齐   在当中就浏览了相关的一些信息,结果发觉结构体在内存中的存储也不是那么难嘛,最基础最重要的还是要先搞清楚四个对齐值:

1:成员自身对齐值      成员变员自身的对齐值   据我个人的拙见应该和所占内存长度有关,char 为 1,short 为2  ,int  为4 ,float 为4                                              ,double  为8

2:结构体自身对齐值     为成员变量中最大的对齐值 

3:指定对齐值                 系统指定,默认为4   

4:有效对齐值                  确定该变量应如何对齐

       在结构体中,首先看自身对齐值,将自身对齐值与指定对齐值做比较,取出较小者作为有效对齐值,来决定如何分配该成员变量的内存,最后看结构体占了多少内存,利用一样的方法找出有效对齐值,是否能被其整除,若不能,则补齐几个字节。

          几个结构体例子:

         假设首地址都为0x000000

           struct test1{         自身对齐值        指定对齐值     有效对齐值        成员首地址       占字节数      补齐字节数    实际所占字节数

             char a;                        1                       4                          1                  0x000000             1                          1                          2

             short  b;                     2                         4                          2                  0x000002              2                      0                           2

            int    c;                         4                        4                            4                0x000004               4                        0                             4

             float  d;                      4                         4                          4                  0x000008              4                           0                           4

             double e;                  8                          4                           4                 0x00000c             8                             0                          8

           };

         结构体自身对齐值 为   8    有效对齐值为   4     所占字节数为  20   能被   有效对齐值     4   整除,所以结果为20 

          struct test2{       自身对齐值        指定对齐值     有效对齐值        成员首地址       占字节数      补齐字节数    实际所占字节数

           int a;                         4                          4                       4                     0x000000             4                        0                    4

           short  b;                   2                            4                     2                     0x000004             2                         2                    4                     

           double c;                  8                             4                     4                    0x000008             8                        0                    8

             char d;                   1                             4                     1                      0x000010            1                          3                  4

            float  e;                  4                               4                     4                     0x000014            4                          0                   4

           };

      结构体的自身对齐值   8 ;   有效对齐值      4   ;  所占字节数  24;  能被  有效对齐值  4  所整除  。

       struct    test4{   自身对齐值        指定对齐值     有效对齐值        成员首地址       占字节数      补齐字节数    实际所占字节数

       int a;                        4                               4                4                      0x000000            4                           0                 4 

       float b;                    4                                 4              4                       0x000004            4                           0                  4 

        short c;                  2                                4                2                      0x000008            2                            2                  4               

        double d;               8                                4                4                      0x00000c            8                          0                     8

        char e;                   1                                 4                1                      0x000014            1                           0                    1

      };

   结构体自身对齐值  8  ; 有效对齐值 4 ;  所占字节数  21 ;不能被    有效地址所整除   需补齐三位才符合条件   所以还要在最后补齐三位,既可以说   char e  占用了一个字节,后面补齐了   3    个字节,结构体实际所占字节数为24。

 

 

 

        老师上课的时候有写代码,因为是在LINUX平台下,我在WINDOWS下面就不能直接看,需要把文件挂载到虚拟机里的LINUX上里去。用samba挂载上去之后又有了一个新问题,因为老板是在图形模式下写的代码,注释什么的都是用中文写的,而我是直接进的字符模式,偏偏那些重要的注释我又看不了,我又不想进图形界面,在网上查了好久,比如说 修改  /etc/sysconfig/i18n配置文件,下载中文语言包,我都试了,还是显示 不了中文,要么是乱码, 要么就是方框,而我又不想用网上说的zhcon的方式去显示,中文,结构可想而知,我没弄好。不过我在改  /etc/sysconfig/i18n的时候发现我在SURPPORTED 变量里面增加或去除   zh_CN.UTF-8后可以有不同的效果,当有此项的时候,我用startx  进入X后可以中文显示我mount上去的文件,当没有此项的时候,显示的是乱码。看来这个支持还是蛮到位的啊。呵呵 ……

       现在对于  /etc/sysconfig/i18n的理解就是   LANG可以设置系统的语言环境,SURPPORTED可以设置系统支持的语言,SYSFONT可以设置字体。当我把LANG设成  zh_CN.UTF-8的时候,命令出错就会显示乱码提示。

 

 

 

       总的来说,今天还是学到了不少东西的,光是结构体在内存中的存储就可以啦,在今后的编程中,可以稍微的进行一下优化什么的,呵呵 ……

原创粉丝点击