精华内容
下载资源
问答
  • C/C++对齐补齐

    2019-08-05 19:58:00
    C/C++对齐补齐规则: 1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的...

    C/C++对齐补齐规则:

    1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

    2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

    结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

    展开全文
  • C++ 对齐规则

    千次阅读 2017-03-17 11:04:41
    1.什么叫对齐? 在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一...单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么样的规则对齐的 2.为什么要对齐? 1.在大多数平台上,

    1.什么叫对齐?

    在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么样的规则对齐的

    2.为什么要对齐?

    1.在大多数平台上,系统从某些特定的位置开始读数据非常快,而从其它位置读数据会慢很多。C/C++是一种注重效率的语言,为了使程序速度尽可能地快,选择牺牲很少的空间,用填充byte的方式保证所有数据的存储都从这些特定的位置开始,而达到较高的运行速度

    2.便于移植,有些系统不支持某些地址的访问。

    3.对齐规则

    (1)结构体的起始地址能被n整除  

    (2)结构体的总大小是结构体最大成员体的整数倍

    (3)结构体成员体的相对起始偏移是成员体大小的整数倍

     当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除。比如某变量的对齐字节数是4,那么它的首地址的16进制形式一定是以0/4/8/C结尾的。

    一般情况下 C/C++ 的变量所占用的字节数

            char:    1字节;

            short:   2字节;

            int:       4字节;

            long:    4字节;

            long long: 8字节;

            float:    4字节;

            double: 8字节;

            bool:    1字节;

           指针:(32位系统4字节,64位系统8字节)

    联合:

    ①联合就是一个结构,②它的所有成员相对于基地址的偏移量都为0,③此结构空间要大到足够容纳最“宽”的成员,④并且,其对齐方式要适合于联合中所有类型的成员。

    怕有的兄弟还不明白,特附图一个帮助理解:

     

    该结构要放得下int i[5]必须要至少占4×5=20个字节。如果没有double的话20个字节够用了,此时按4字节对齐。但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的,所以必须添加4个字节使其满足8×3=24,也就是必须也是8的倍数,这样一来就出来了24这个数字。综上所述,最终联合体的最小的size也要是所包含的所有类型的基本长度的最小公倍数才行。(这里的字节数均指winnt下的值,平台、编译器不同值也有可能不同。)


    #include<iostream>
    using namespace std;
    struct A
    {
    	char a;
    };
    
    struct B : public A
    {
    	int b;
    };
    
    struct C :public B
    {
    	virtual ~C(){};
    };
    
    
     
    
    
    int main()
    {
    	cout << sizeof (A) <<" "<< sizeof (B) << " "<<sizeof (C) << endl;
    
     
    
    }

    在32位vs下结果为: 1 8 16

    参考:

    1.C++里的对齐规则 - 幸福在路上 - 博客频道 - CSDN.NET http://blog.csdn.net/mishifangxiangdefeng/article/details/48378879

    2.union 类型 内存对齐 - yuliying的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/yuliying/article/details/48781087



    展开全文
  • C++ 对齐原则

    2020-07-05 21:49:25
    (1)概念: ...基本数据类型的自身对齐值:例如,char型数据的自身对齐值为1字节,short类型自身对齐值为2字节,int、float、long类型自身对齐值均为4字节,double类型自身对齐值均为8字节。 结...

    1)概念:     

    现代计算机系统中,内存都是依照字节进行划分,理论上讲对于任何类型的变量的访问都可以从任何地址开始,但实际应用中,对特定类型的变量经常在特定内存地址进行访问,需要各种类型的数据按照一定的规则进行布置,而不是顺序的一个接一个排列,字节对齐就是用空间换时间,提高存取效率

    2)原则:

    基本数据类型的自身对齐值:例如,char型数据的自身对齐值为1字节,short类型自身对齐值为2字节,int、float、long类型自身对齐值均为4字节,double类型自身对齐值均为8字节。

    结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。

    指定对齐值:通过预编译指令 #pragma pack (value) 来指定的对齐值value。(注:取消自定义对齐值得指令为 #pragma pack ( ))

    数据成员、结构体和类的有效对齐值:其自身对齐值和指定对齐值中较小的那个值。

    (3)举例:

    例1:

                                                                     

    char、short、int是基本数据,自身对齐值为1、2、4,所以结构体的自身对齐值 为成员中最大的,即4。

            例2:

                                                   

    例3:

                      

     

    展开全文
  • c++对齐方式总结(上)

    千次阅读 2010-11-16 15:21:00
    c++对齐方式总结

    发现从网上获得的这些信息上受益匪浅,同时感慨人家怎么那么牛,不仅技术牛,而且文章写的也好呢!真是自叹不如,同时也想实践一下,记录一下自己的学习心得,练练自己的文笔,不求能帮得上大家,但求能在这个网上结识一些朋友,大家互相学习,共同进步

    编译器要对c++代码进行编译时需要按照相应的类型为变量分配内存空间,最为人们熟知的就是那五个空间了:栈,堆,全局数据区,常量区和代码区。现在知道了哪些变量存放在哪些空间里了,但是在相应的空间里又是如何存放的呢?相信很多人都已经知道了,我也知道了。

    对齐方式有三种规则,看网上已经很详细了,我还是想用自己的话再说一遍吧:

     

     

     

    下面用网上的例子和我的改进加以说明

    试验:通过#pragma pack(n)改变“对齐系数”,然后察看sizeof(struct test_t)的值。

     1字节对齐(#pragma pack(1))

    输出结果:sizeof(struct test_t) = 8

    分析过程:

    1) 成员数据对齐

    #pragma pack(1)

    struct test_t {

     int a;  /* 长度4 > 1 1对齐;起始offset=0 0%1=0;存放位置区间[0,3] */

     char b;  /* 长度1 = 1 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

     short c; /* 长度2 > 1 1对齐;起始offset=5 5%1=0;存放位置区间[5,6] */

     char d;  /* 长度1 = 1 1对齐;起始offset=7 7%1=0;存放位置区间[7] */

    };

    #pragma pack()

    成员总大小=8

     2) 整体对齐

    整体对齐系数 = min((max(int,short,char), 1) = 1

    整体大小(size)=$(成员总大小)  $(整体对齐系数) 圆整 = 8 /* 8%1=0 */ [1]

     

    2字节对齐(#pragma pack(2))

    输出结果:sizeof(struct test_t) = 10

    分析过程:

    1) 成员数据对齐

    #pragma pack(2)

    struct test_t {

     int a;  /* 长度4 > 2 2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */

     char b;  /* 长度1 < 2 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

     short c; /* 长度2 = 2 2对齐;offset 需要按照原则1自增,直到起始offset=6 6%2=0;存放位置区间[6,7] */

     char d;  /* 长度1 < 2 1对齐;起始offset=8 8%1=0;存放位置区间[8] */

    };

    #pragma pack()

    成员总大小=9

    2) 整体对齐

    整体对齐系数 = min((max(int,short,char), 2) = 2

    整体大小(size)=$(成员总大小)  $(整体对齐系数) 圆整 = 10 /* 10%2=0 */

     

    4字节对齐(#pragma pack(4))

     

    输出结果:sizeof(struct test_t) = 12

    分析过程:

    1) 成员数据对齐

    #pragma pack(4)

    struct test_t {

     int a;  /* 长度4 = 4 4对齐;起始offset=0 0%4=0;存放位置区间[0,3] */

     char b;  /* 长度1 < 4 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

     short c; /* 长度2 < 4 2对齐;起始offset=6 6%2=0;存放位置区间[6,7] */

     char d;  /* 长度1 < 4 1对齐;起始offset=8 8%1=0;存放位置区间[8] */

    };

    #pragma pack()

    成员总大小=9

     2) 整体对齐

    整体对齐系数 = min((max(int,short,char), 4) = 4

    整体大小(size)=$(成员总大小)  $(整体对齐系数) 圆整 = 12 /* 12%4=0 */

     

     

    展开全文
  • C++对齐方式

    千次阅读 2016-11-15 16:47:08
    清除右对齐以后在调用 cout 就没问题了。 或者更简洁些,你可以写成 cout 这样也能达到你所希望的效果。 还有也可以使用cout.flags(ios::left)设置左对齐。 例如: 1. cout cout cout ...
  • C/C++对齐问题

    2020-03-23 21:57:04
    C11 的对齐特性比用位填充字节更自然,它们还代表了C在处理硬件相关问题上的能力。 在这种上下文中,对齐指的是如何安排对象在内存中的位置。 例如,为了效率最大化,系统可能要把一个 double 类型的值储存在4 字 节...
  • class stru { int number; char name[10]; int chinese; int einglish; int math; ... cin >> number >> name >> chinese >> einglish >> math;...输出两行无法对齐应该怎么改求代码谢谢为什么
  • c/c++对齐规则

    2014-02-19 13:08:30
    每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:...
  • c++对齐方式总结(下)

    千次阅读 2010-11-16 15:46:00
    8字节对齐(#pragma pack(8))输出结果:sizeof(struct test_t) = 12 [两个编译器输出一致]分析过程:1) 成员数据对齐#pragma pack(8)struct test_t { int a; /* 长度4 char b; /* 长度1 short c; /* 长度2 char d;...
  • % 2d(空格填充,右对齐) 是将数字按宽度为2,采用右对齐方式输出,如果数据位数不到2位,则左边补空格 %02d(0填充,右对齐) 默认情况下,数据数据宽度不够2位是用空格填补的,但是因为2d前面有0,表示,...
  • 一般来讲, 访问未对齐的内存(misaligned access)轻则影响效率, 重则引发异常(包括指令执行异常和结构体对齐不正常引发的逻辑BUG等), 总之内存对齐是程序员尤其是C/C++程序员是不得不重视的一个问题. MSVC++提供了两...
  • C++ 内存对齐

    千次阅读 2019-10-22 15:02:47
    C++ 内存对齐,看下面三篇文章: C++内存对齐总结 vs2012编译器c++存储内存对齐情况详解 c++中的内存对齐
  • C++字节对齐

    2019-05-15 14:45:58
    C和C++字节对齐 文章目录C和C++字节对齐1. 什么是字节对齐2. 对齐的原因和作用3. 对齐准则4. 结果分析5. 字节对齐设置 1. 什么是字节对齐   现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问...
  • C++内存对齐

    2012-05-24 15:59:30
    C++内存对齐是个看似简单,但大家经常容易犯错的地方,本文详细总结了C++内存对齐,尤其是结构体对齐方面的知识,提出了自己理论总结,希望能对读者有参考价值!
  • VS C++字节对齐方式

    2020-12-18 23:56:48
    VS C++字节对齐方式
  • C++ 内存对齐原则及作用 C++ 内存对齐原则及作用 C++ 内存对齐原则及作用
  • C++内存对齐总结

    2020-03-30 18:46:17
    C++内存对齐总结
  • C++字节对齐问题

    2014-04-01 22:46:17
    C++字节对齐问题
  • c++ 内存对齐的完整文档 c++ 内存对齐的完整文档 c++ 内存对齐的完整文档
  • c++内存对齐

    2016-04-26 17:02:39
    C++内存字节对齐 每个编译器都有自己默认的字节对齐方式。可以通过#pragma pack(n) n为2的幂来改变这一系数。简单地说,32位默认为8bytes,64位默认为16bytes。 对齐的规则 1) 结构体或联合体或类的数据成员,...
  • c/c++字节对齐

    2017-07-14 18:28:33
    c/c++字节对齐问题
  • C++内存对齐原则

    2017-07-04 21:16:43
    C++内存对齐原则 (1)在没有#pragam pack宏的情况下,struct/class/union内存对齐原则有四个:  数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的位置,以后每个数据...
  • 主要介绍了C语言、C++内存对齐问题详解,内存对齐的问题主要存在于理解struct和union等复合结构在内存中的分布,需要的朋友可以参考下
  • C++ 字节对齐规则

    2020-09-21 22:30:22
    C++ 字节对齐规则 规则 遵循结构体对齐(成员大小向各参数中较小的对齐,结构体总长度要是所有对齐参数的整数倍) 空类大小为1:地址唯一,相当于占位符 成员函数中有虚函数(要有一个虚表指针),普通成员函数不占...
  • C++地址对齐

    千次阅读 2016-10-19 18:01:17
     一、什么是对齐  在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑...单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么  样的规则对齐的。 二、为什么对齐
  • C++ 字节对齐

    2011-11-07 21:42:00
    C++ 字节对齐 1. 缘起  来自BBS上的面试题目,struct{int a; char b;}的大小是多少?答案是8。上网看了下,是字节对齐。 2. 字节对齐的基本规则  首先,每种类型的变量的默认对齐长度都是自己的变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,511
精华内容 31,804
关键字:

c++对齐

c++ 订阅