double类型结构体对齐的疑惑

问题描述

double类型结构体对齐的疑惑

32bit的cpu,在msvc中如果结构体有double类型,则以8字节对齐,例如
struct test
{
char ch;
double j;
};
ch也会占用8个字节,而32bit的cpu会一次性取到8个字节么?难道不是32bit,4个字节?
为什么要以8个字节来对齐呢?谢谢

解决方案

如果编译器为sse优化,那么是按照128bit,也就是8字节对齐的,如果编译器为sse2优化,那么是按照16字节对齐的。
http://www.xuebuyuan.com/652857.html

解决方案二:

struct会进行对齐时为了提高效率,便于cpu操作。如果32bit的cpu一次最多只能取32bit的数据,那么
只要double的首位跟4Byte对齐,都是分2个指令取出来,根本不需要非得8byte的差,所以为什么不将ch之后只填充3个byte,然后直接是double呢

解决方案三:

32bit只是说明对齐格式,但是double占用了8个字节。为了跟它对齐,会填充到8个字节。

时间: 2024-11-01 15:02:20

double类型结构体对齐的疑惑的相关文章

C中的结构体对齐可以把下一个的类型补到前一个???

问题描述 C中的结构体对齐可以把下一个的类型补到前一个??? 解决方案 结构体对齐说的是编译器的事情,不是你定义一个字段然后自己去凑.千万不要从百度百科这种垃圾网站获得信息. 解决方案二: 同一类型的可以合并,很正常, 从对齐看,对其对齐要求是一样的,不冲突 实际上 char,char ,short 也可以合并成 一个int 当 char 8Bits,short16Bits,int32bits 的时候 只有当下个数据, 不在对齐位置的时候, 才会在两个数据中间插入间隙.

关于C语言中的结构体对齐

(1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个. (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问.这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列. 举个例子

【C/C++学院】0730-网站以及后门/结构体对齐、结构体面试分析/深拷贝与浅拷贝/队列/字符串封装

 网站以及后门 Windwos安装Apache服务器软件,进行测试.Localhost 将可执行程序xxx.exe改为xxx.cgi放到apache服务器上,通过浏览器进行访问. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { printf("Content-type:text/html\n\n&quo

c语言中结构体对齐详解

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

实例讲解C语言编程中的结构体对齐_C 语言

Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include <stdio.h> #include <string.h> #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue)); #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (

c语言-求助!!!关于C里scanf %s %c和结构体之间的疑惑!!!

问题描述 求助!!!关于C里scanf %s %c和结构体之间的疑惑!!! 最近在编一个学生成绩管理系统,然后就发现了一个问题..... scanf("%s %s %c ",name,stunum,&sex); 在运行时输入Xiaoming 2015000000 F 输出的stunum是2015000000, sex是F 但是把语句改成 scanf("%s %s %c ",student[0].name,student[0].stunum,&stud

struct-数组和结构体对齐关系,求大神解决!

问题描述 数组和结构体对齐关系,求大神解决! #include typedef struct { unsigned char a; unsigned char b; unsigned int c; unsigned short d; unsigned int e; } ABC; const unsigned short code1[6] = {0x1607,0x1003,0x1008,0x2001,0x3002,0x4003}; void main(void) { ABC * p = (ABC

结构体对齐,结构体深拷贝和浅拷贝

 struct定义 #include<stdio.h> #include<stdlib.h>   //最宽基本成员,char,int,double,结构体数组都不是最宽基本成员 //结构体大小必须可以整除最宽基本成员,是最宽基本成员的整数倍 //结构体成员地址减去结构体首地址,就是偏移量,偏移量必须可以整除成员的基本类型 structinfo{    charc;    doublesh;    charch[9]; };   structinfo1 {    shortsh1

C/C++结构体字节对齐详解

原文:http://blog.csdn.net/hyljqr/article/details/500899 结构体的sizeof先看一个结构体:struct S1{    char c;    int i;};  sizeof(s1)在VC6中按默认设置得到的结果为8.我们先看看sizeof的定义--sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况S1 s1 = { 'a', 0xFFFFFFFF };定义上面的变量后,加上断点,运行程序,观察s1所在