zoukankan      html  css  js  c++  java
  • 内存对齐

    #include <iostream>
    using namespace std;
    
    #pragma pack(2)
    class A
    {
    	int i;
    	union U
    	{
    		char buff[13];
    		int i;
    	}u;
    	void foo() {    }
    	typedef char* (*f)(void*);
    	enum{red, green, blue} color;
    
    }a;
    int main(void)
    {
    	cout << sizeof(a)<< endl;
    	return 0;
    }

    运行结果:



        看到这个结果是22,不是24是不是感觉很惊讶。我们除了共用体U外全部屏蔽,再次执行看看执行结果是多少?

    #include <iostream>
    using namespace std;
    
    #pragma pack(2)
    class A
    {
    //	int i;
    	union U
    	{
    		char buff[13];
    		int i;
    	}u;
    	void foo() {    }
    	typedef char* (*f)(void*);
    //	enum{red, green, blue} color;
    
    }a;
    int main(void)
    {
    	cout << sizeof(a)<< endl;
    	return 0;
    }


    执行结果:


        看到这里,你也许就知道了第一次执行的结果为什么不是24,而是22,因为这里有句#pragma pack(2)   就是这句,使得内存是按照2字节对齐的关系,而不是默认的4字节对齐。如果把这句#pragma pack(2)去掉,再次执行,结果为16,这里就不贴图片了。

        那么空类,或者没有变量的对象的大小为多少呢?

    #include <iostream>
    using namespace std;
    
    #pragma pack(2)
    class A
    {
    //	int i;
    //	union U
    //	{
    //		char buff[13];
    //		int i;
    //	}u;
    	void foo() {    }
    	typedef char* (*f)(void*);
    //	enum{red, green, blue} color;
    
    }a;
    int main(void)
    {
    	cout << sizeof(a)<< endl;
    	return 0;
    }


    执行结果:


         对,没错,空类,或者没有变量只有函数声明的类对象所占的大小为1.


    如果去掉#pragma pack(2),执行结果是多少呢?

    #include <iostream>
    using namespace std;
    
    
    class A
    {
    	int i;
    	union U
    	{
    		char buff[13];
    		int i;
    	}u;
    	void foo() {    }
    	typedef char* (*f)(void*);
    	enum{red, green, blue} color;
    }a;
    int main(void)
    {
    	cout << sizeof(a)<< endl;
    	return 0;
    }




  • 相关阅读:
    NO 3 ,人生苦短,我学python之python 元祖tuple魔法
    NO 2,人生苦短,我学python之python 列表list的魔法
    NO 1,人生苦短,我学python之python 字符串的魔法
    几种常见登录验证的方式总结
    Spring Boot 解决跨域问题的 3 种方案
    浅析VO、DTO、DO、PO的概念、区别和用处
    对于分库分表的入门理解
    在项目启动后执行某段功能代码
    jna编程学习
    RabbitMQ详解
  • 原文地址:https://www.cnblogs.com/james1207/p/3358137.html
Copyright © 2011-2022 走看看