由朗讯的一道笔试题想到的

博客可能围绕VC++编译器展开,涉及结构体(struct)的对齐(alignment)问题,还提及了float类型,可能探讨了这些在编译器中的处理机制以及对内存使用(rss)的影响。


  首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类我的文档
全部文章发表文章
专栏管理使用说明

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1076724771190722&dt=1127999126296&lmt=1127702876&format=125x125_as&output=html&url=http%3A%2F%2Fdev.csdn.net%2Fdevelop%2Farticle%2F77%2F77435.shtm&ref=http%3A%2F%2Fwww.csdn.net%2FLoginPageSideColumns.aspx&cc=217&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="125" scrolling="no" height="125" allowtransparency="65535">

 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
fatalerror99 (45)
zeroless (17)
ilovevc (26)
redbeans (4)
jerryfleming (5)
eXile_ (1)
Amoon100 (10)
machozhao (2)
fire_woods (7)
BigFanOfCpp (12)
CSDN - 文档中心 - 其他开发语言 阅读:0   评论: 0    参与评论
标题  由朗讯的一道笔试题想到的!     选择自 cxyol 的 Blog
关键字  由朗讯的一道笔试题想到的!
出处 

朗讯的笔试题是这样的:

Typedef union student

{

       Char name[10]

       Long sno;

       Char sex;

       Float score [4];

} STU;

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

答案是80 ,因为union是可变的以其成员中最大的成员作为 该union的大小!

但是换成是 struct又是多少呢?

Typedef struct student

{

       Char name[10]

       Long sno;

       Char sex;

       Float score [4];

} STU;

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

答案是 180  ????为什么不是 (10+4+1+16)*5=155? 因为struct 有个叫对齐方式的问题:

         不对齐的数据存取在x86上影响速度,因为在不对齐的时候,对于小的可能会影响 其效率,对齐即是多分配一些字节,填充无用数据,以空间的损失来换取消率。

       struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array、struct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对齐(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

      自然对齐(natural alignment)即默认对齐方式,是指按结构体的成员中(类型)size最大的成员作为基本的分配单元,而且与其顺序有这密切的联系。

     例如:

struct naturalalign
{
 char a;
 short b;
 char c;
};

  在上述结构体中,size最大的是short,其长度为2字节,因而结构体中的char成员a、c都以2为单位对齐,sizeof(naturalalign)的结果等于6;

    如果改为:

struct naturalalign
{
 char a;
 int b;
 char c;
};

  其结果显然为12。

    那么再回到到原题:结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;Long sno; 4个字节;Char sex; 4个字节(这里对齐了);Float score [4]; 16个字节。于是(12+4+4+16)×5=180,就是了!

     刚才还说过,与顺序有关,呵呵,我们改一下:

Typedef struct student

{

       Char name[10]

       Char sex;

       Long sno;

       Float score [4];

} STU;

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!

所以要小心呀!

2.2指定对齐

  一般地,可以通过下面的方法来改变缺省的对齐条件:

  · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
  · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

  注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。

     例如:

#pragma pack (n)
struct naturalalign
{
 char a;
 int b;
 char c;
};
#pragma pack ()

  当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。

  在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。

图1:在VC++ 6.0中指定对界方式

  另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。

Typedef struct student

{

       Char name[10]

       Char sex;

       Long sno;

       Float score [4];

} STU;

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!

所以要小心呀!

2.2指定对齐

  一般地,可以通过下面的方法来改变缺省的对齐条件:

  · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
  · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

  注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。

     例如:

#pragma pack (n)
struct naturalalign
{
 char a;
 int b;
 char c;
};
#pragma pack ()

  当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。

  在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。

图1:在VC++ 6.0中指定对界方式

  另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。

Typedef struct student

{

       Char name[10]

       Char sex;

       Long sno;

       Float score [4];

} STU;

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

Main ()

{

STU a[5]

Printf(“%d/n”,sizeof(a)

}

 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160,就是了!

所以要小心呀!

2.2指定对齐

  一般地,可以通过下面的方法来改变缺省的对齐条件:

  · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
  · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

  注意:如果#pragma pack (n)中指定的n大于结构体中最大成员(类型)的size,则其不起作用,结构体仍然按照size最大的成员进行对齐。

     例如:

#pragma pack (n)
struct naturalalign
{
 char a;
 int b;
 char c;
};
#pragma pack ()

  当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。

  在VC++ 6.0编译器中,我们可以指定其对齐方式(见图1),其操作方式为依次选择projetct > setting > C/C++菜单,在struct member alignment中指定你要的对界方式。

图1:在VC++ 6.0中指定对界方式

  另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。


相关文章
对该文的评论


网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式 - English
北京百联美达美数码科技有限公司 版权所有 京ICP证020026号
Copyright © CSDN.NET, Inc. All Rights Reserved
内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道与桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键环节,重点揭示高速行车条件下基础设施的振动传递规律与力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化与运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程与交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课题的研究者。; 使用场景及目标:①用于高校与科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示与科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估与减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围与优化方向。
内容概要:本文系统研究了非线性薛定谔方程的物理信息神经网络(PINN)求解方法,提出一种将物理规律嵌入深度学习模型的科学计算新范式。通过构建全连接神经网络架构,将非线性薛定谔方程及其初始/边界条件作为损失函数的核心组成部分,实现了在无须大量标注数据的前提下对复值偏微分方程的高精度数值求解。该方法充分利用自动微分技术精确计算方程残差,有效融合了数据驱动与模型驱动的优势,在光学孤子传播、量子系统演化等典型场景中展现出优异的逼近能力与泛化性能。文中配套提供了完整的Python实现代码,涵盖网络搭建、损失定义、训练优化与结果可视化全流程。; 适合人群:具备Python编程能力与深度学习基础知识,熟悉偏微分方程理论及科学计算的理工科研究生、科研人员,以及从事光学、量子物理、流体力学等领域建模与仿真的工程技术人员。; 使用场景及目标:① 掌握PINN方法的基本原理与实现技巧;② 学习如何将复杂物理方程转化为可训练的神经网络损失项;③ 应用于非线性光学、玻色-爱因斯坦凝聚、水波动力学等问题的仿真与预测;④ 为相关科研课题提供可复现的算法原型与代码参考。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解神经网络对微分算子的近似机制、损失函数的多任务加权策略以及训练过程中的超参数调优方法,进而可迁移至其他非线性偏微分方程的求解任务,拓展其在交叉学科中的应用边界。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 微软推出的【AZ-900微软认证】是一项针对初学者的基础级云服务资格认证,其目的在于帮助学习者掌握云概念、微软Azure服务的运作机制以及云解决方案的核心知识。获得这一认证后,考生将能够清晰地理解云计算领域的基础术语、服务模式(包括IaaS、PaaS、SaaS等)以及这些服务在Azure平台上的实际应用方式。 在【必过考题】部分,我们可以观察到两个重点议题,它们分别聚焦于PaaS(平台即服务)的概念阐释和云成本的计算方式。 在第一个议题中,考生被要求辨别关于PaaS的正确性描述。PaaS平台提供了一个开发环境,但并不允许用户直接访问操作系统(Box 1: No)。比如,Azure Web Apps服务可以用来部署web应用,但用户无法直接管理虚拟机或IIS系统。另一方面,PaaS确实具备自动扩展的功能(Box 2: Yes),这表示可以根据实际需求自动增加负载均衡的虚拟机以支持web应用的运行。PaaS框架还为开发人员提供了构建和调整云端应用的工具,预置的应用组件能够有效缩短新应用的编程周期(Box 3: Yes)。 第二个议题同样关注云计算理念的理解,尤其强调IT支出从资本性支出(CapEx)向运营性支出(OpEx)的转型思想。传统的IT投资通常被视为CapEx,而云计算的按需付费机制使企业能够将这部分开支转化为OpEx,从而在财务规划上获得更大的自由度。 在为AZ-900考试做准备时,考生需要特别关注以下几个核心知识点: 1. **云服务模式**:深入理解IaaS(基础设施即服务)、PaaS和SaaS(软件即服务)之间的差异及其各自的应用情境。 2. **Azure服务*...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值