C/C++内存对齐

有时会在c/c++中看到这种形式

#pragma pack(n)
#pragma pack()

前一句代表设置对齐的字节数为n,而不是编译器默认的对齐字节数(ubuntu 14.04 x86_64下为8),后一句代表恢复默认值,合理地使用内存对齐能减少程序占用的内存空间,使用不当也会降低存取效率从而降低程序性能。在分析内存对齐时,只需要采用以下的原则,这里以一段代码简单解释下

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //缺省,一般8字节对齐
    //struct有成员字节大于pack值,对齐为pack的整数倍=>24
    struct default_pack_struct_size_bigger {
        struct c {
            long long a;
            char d;
        } m;
        char b;
    };
    printf("default_pack_struct_size_bigger:%d\n",(int)sizeof(struct default_pack_struct_size_bigger));
    //struct成员字节数都小于pack,按字节数最大的对齐=>4
    struct default_pack_struct_size_smaller {
        char a;
        short int b;
    };
    printf("default_pack_struct_size_smaller:%d\n",(int)sizeof(struct default_pack_struct_size_smaller));

    //设置pack为4
    #pragma pack(4)
    //结构成员有大于4字节的 => 12
    struct pack_4_struct_size_bigger {
        unsigned short int a;
        long long b;
    };
    printf("pack_4_struct_size_bigger:%d\n",(int)sizeof(struct pack_4_struct_size_bigger));
    //结构成员都小于4字节 => 4
    struct pack_4_struct_size_smaller {
        char a;
        unsigned short int b;
    };
    printf("pack_4_struct_size_smaller:%d\n",(int)sizeof(struct pack_4_struct_size_smaller));
    #pragma pack()

    return 0;
}

结果:

时间: 2024-10-30 22:27:10

C/C++内存对齐的相关文章

内存对齐原则

内存对齐,一般针对结构体或者是类 系统默认内存对其字数是4 可以使用   #pragma  pack(n)   来设置对齐字数,1,2,8.   对齐原则:(以4字节为例) 对于大于等于4字节的成员起始位置应该是4的整数倍,对于等于2字节的成员,起始位置应该是2的整数倍,对于1字节的成员,可以在任意位置,但是成员顺序应该和定义顺序一致,不能改变.总结构体的大小应该是4的倍数.    

c/c++中内存对齐详解

一,什么是内存对齐?内存对齐用来做什么? 所谓内存对齐,是为了让内存存取更有效率而采用的一种编译阶段优化内存存取的手段. 比如对于int x;(这里假设sizeof(int)==4),因为cpu对内存的读取操作是对齐的,如果x的地址不是4的倍数,那么读取这个x,需要读取两次共8个字节,然后还要将其拼接成一个int,这比存取对齐过的x要麻烦很多. 二,怎么算内存对齐大小(理论)? 对于简单类型,如int,char,float等,其对齐大小为其本身大小,即align(int) == sizeof(i

深入理解C语言内存对齐

 这篇文章主要介绍了C语言内存对齐,有需要的朋友可以参考一下 一.内存对齐的初步讲解   内存对齐可以用一句话来概括:   "数据项只能存储在地址是数据项大小的整数倍的内存位置上"   例如int类型占用4个字节,地址只能在0,4,8等位置上.   例1:   代码如下: #include <stdio.h> struct xx{         char b;         int a;         int c;         char d; };   int m

内存对齐详解

摘要 本文描述了内存对齐的各种概念和内存管理的其他知识点,应用相应的程序示例进行解释. 一.什么是内存对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问, 这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是内存对齐. 二.内存对齐的原因 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特

C语言内存对齐详解

一.字节对齐基本概念     现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存 储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生 错误,那么在这种架构下编程必须保

内存分配与内存对齐全面探讨

转自:http://blog.csdn.net/cuibo1123/article/details/2547442 引言 操作系统的内存分配问题与内存对齐问题对于低层程序设计来说是非常重要的,对内存分配的理解直接影响到代码质量.正确率.效率以及程序员对内存使用情况.溢出.泄露等的判断力.而内存对齐是常常被忽略的问题,理解内存对齐原理及方法则有助于帮助程序员判断访问非法内存. 程序的内存分配问题 一般C/C++程序占用的内存主要分为5种 1.栈区(stack):类似于堆栈,由程序自动创建.自动释放

Nginx学习笔记(五) 源码分析&amp;内存模块&amp;内存对齐

今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_alloc.h&Ngx_alloc.c 先上源码: /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_ALLOC_H_INCLUDED_ #define _NGX_ALLOC_H_INCLUDED_ #include <ngx_confi

《从缺陷中学习C/C++》——6.16 结构体成员内存对齐问题

6.16 结构体成员内存对齐问题 从缺陷中学习C/C++ 代码示例 struct{ char flag; int i; } foo; int main() { foo.flag = 'T'; int pi = (int )(&foo.flag + 1); *pi = 0x01020304; printf("flag=%c, i=%x\n", foo.flag, foo.i); return 0; } 现象&后果 代码中定义了一个结构体,包括一个字符成员flag和整型成员

深入内存对齐的详解_C 语言

1.引子     在结构中,编译器为结构的每个成员按其自身的自然对界(alignment)条件分配空间.各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同.     例如,下面的结构各成员空间分配情况(假设对齐方式大于2字节,即#pragma pack(n), n = 2,4,8...下文将讨论#pragmapack()): 复制代码 代码如下: struct test {     char x1;     short x2;     float x3;