union和struct类型大小的跨平台讨论

这个问题的教材网上很多,我就不多说了这里给出一个:点击打开链接

这个问题又最容易引起争执,为什么呢?与平台或者说与编译器有关系,先看看下面的代码:

#include <iostream>

using namespace std;

union U1
{
    char a[9];
    int b;
};

union U2
{
    U1 a;
    double b;
};

union U3
{
    char a[10];
    double b;
};

struct S1
{
    char a[13];
    double c;
};

struct S2
{
    S1 a;
    U1 b;
};

struct S3
{
    char b;
    int c;
    char d[13];
};

int main()
{
    cout << "U1: " << sizeof(U1)<< endl;
    cout << "U2: " << sizeof(U2)<< endl;
    cout << "U3: " << sizeof(U3)<< endl;
    cout << "S1: " << sizeof(S1)<< endl;
    cout << "S2: " << sizeof(S2)<< endl;
    cout << "S3: " << sizeof(S3)<< endl;
    return 0;
}

我用了两种方法测试,测试结果如下:

(1)Ubuntu系统下,G++编译的结果如下:

(2)Windows系统下,Cmake编译的结果如下:

具体不是很清楚,可能是Ubuntu做了一些优化,欢迎讨论

时间: 2024-12-15 13:49:47

union和struct类型大小的跨平台讨论的相关文章

C语言union关键字,union和struct区别

union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址.例子如下: union StateMachine { char character; int number; char *str; double exp; }; 一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,

笔试题之union与struct

union与struct之间的区别,说起来简单,struct内各变量是拥有独立的内存,union里面各变量共享内存,修改一个变量的值也既修改了另一个值. 然而,今天中兴笔试遇到这样一个问题 union { struct { int a; int b; } e; int i; int j; } u; u.i=1; u.j=2; u.e.a=u.i*u.j; u.e.b=u.i*u.j; printf(“%d",u.e.a); printf("%d",u.e.b): 结果是4和1

golang的struct{}类型channel

struct{}是结构体类型的代表: struct{}{}是结构体的值,并且值为空的代表 之前看代码的时候发现有如下定义的channel,就觉得很诧异 var ch chan struct{} 这其中,struct{}是个什么鬼. 实际上struct{}就是一种普通数据类型,只是没有具体的值而已. 常用用法 通常struct{}类型channel的用法是使用同步,一般不需要往channel里面写数据,只有读等待,而读等待会在channel被关闭的时候返回. package main import

用union 和 struct 位域操作

很久没有用C 语言中的 union 和 struct 位域操作了. 最近用了一下(当然,我承认是从stackoverflow 上抄的) 需求是这样的,已知一个 LPARAM 整数 3866625 ,求他的第30位的值是多少. 解法也挺简单 int a = 3866625; a = a>>30 & 0x0001; //注意是右移动30,而不是29,因为第一位是0 ,我一开始就移动的29 结果算错! 但是我偶然在stack over flow 上看到了 另外一种方案 union KeySt

C#各类型大小

C#各类型大小,布布扣,bubuko.com

sockaddr struct 类型重定义

windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问题,自己写的一个库里要用到ws2tcpip,这个头文件第一个包含的头文件就是winsock2.h把它放到windows前,库是能成功编译了,但当我在一个wxWidgets中调用它时,又出现那个让人厌烦的错误 ““sockaddr”: “struct”类型重定义”明显是wxWidgets先包含了win

C语言复杂struct类型get或者set字段的简化方法

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span.s1 { font: 12.0px "Helvetica Neue" } 今天学习librdkafka的conf配置相关的代码,学到了一个C语言代码编写的技巧.作者真的是把C语言用得出神入化. 我们平时编写C语言代码,经常会用struct类型来模拟面向对象中的class.比如我实现了下面

Go语言struct{}类型的channel

在Go语言中,有一种特殊的struct{}类型的channel,它不能被写入任何数据,只有通过close()函数进行关闭操作,才能进行输出操作..struct类型的channel不占用任何内存!!! https://blog.csdn.net/qq_35976351/article/details/82026108 原文地址:https://www.cnblogs.com/longchang/p/12217763.html

c语言中union及struct区别

union(联合体)使用类似于struct(结构体),但是它与struct有如下明显差异: 1.union中可以定义多个成员变量,union的大小由最大的成员的大小决定.struct同样可由多个数据类型成员组成,struct的大小也是所有成员的大小之和(考虑对齐). 2.union一次只能使用其中一个成员,所有成员共享同一块内存.当对其它成员进行赋值,原来成员的值就不存在了.而struct成员的赋值是不会互相影响的. 3.union只能用其第一个成员类型的值进行初始化. 版权声明:本文为博主原创