struct结构会增加程序的开销

    struct结构一方面能够加强对变量的管理,增加程序的可读性,但是另一方面,结构体也会加大程序的开销。

    看下面一段代码:

struct TEST_S
{
	int a;
	int b;
	float c;
};
int _tmain(int argc, _TCHAR* argv[])
{
	TEST_S ts;
	int a;
	int b;
	int c;
	ts.a = 100;
	ts.b = 200;
	ts.c = 300.f;

	a = 100;
	b = 200;
	c = 300.f;

	return 0;
}

    使用反汇编工具,

<strong><span style="font-size:18px;"></span></strong><pre name="code" class="cpp">	ts.a = 100;
	ts.b = 200;
	ts.c = 300.f;

    给结构体3个变量赋值,实际上在Debug下汇编代码为:

mov         dword ptr [ts],64h
mov         dword ptr [ebp-0Ch],0C8h
movss       xmm0,dword ptr ds:[0BA5858h]
movss       dword ptr [ebp-8],xmm0  

    从汇编代码中可以看出,除了结构体的第一个变量外,接下来的变量就需要在结构体的头地址的基础上加上偏移量,而非结构体的情况如下:

	a = 100;
	b = 200;
	c = 300.f;

其汇编代码如下:

mov         dword ptr [a],64h
mov         dword ptr [b],0C8h
mov         dword ptr [c],12Ch 

    明显少了一步地址减法。

    但是在Release情况下,编译器默认对程序进行优化,由于优化下的汇编代码无法查看,所以无法查清其实际开销情况。

时间: 2024-10-10 23:22:16

struct结构会增加程序的开销的相关文章

(C)struct结构体指针

结构体指针 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员:其二是指向结构的指针(称为结构指针). 前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点. 结构指针说明的一般形式是: struct (结构类型名称) * (结构指针变量名);例如:struct date * pdate, today;说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量. 语句: struct date{ int year; int mo

C# struct 结构

结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构. 一般情况下,我们很少使用结构,而且很多人也并不建议使用结构,但作为.NET Framework 一般型別系统中的一个基本架构,还是有必要了解一下的. 结构的特征: 结构是一种值类型,并且不需要堆分配. 结构的实例化可以不使用 new 运算符. 在结构声明中,除非字段被声明为 const 或 static,否则无法初始化. 结构类型永远不是抽象的,并且始终是隐式密封的,因此在结构声明中不允许使用abst

c语言 struct结构体的变量声明加冒号

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可. 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示. [1]定义: struct 位域结构名 { 位

P Invoke struct结构

一.获取Struct CHCNetSDK.NET_DVR_PTZPOS pos = new CameraTest.CHCNetSDK.NET_DVR_PTZPOS(); int size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_PTZPOS)); IntPtr ptr = Marshal.AllocHGlobal(size);// 申请内存 uint bytesReturnd = 0; try { if (!CHCNetSDK.NET_DVR_GetD

struct结构体基础知识

/* ============================================================================ Name : TestStruct.c Author : lf Version : Copyright : Your copyright notice Description : struct结构体基础知识 ==================================================================

go struct结构体

struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性) struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以嵌套 Go语言没有class类型,只有struct类型 1.struct 声明 type 标识符 struct { field1 type field2 type } 样例: type Student struct { Name string Age int Score int } 2.struct 中字段访问:和其他

struct结构体自动化构想性能监控

TABLE_NAME不查询其他数据库中的表.外为了以防万一,可以在SQL语句中写表时加上数据库比如SELECT column_name ,TABLE_NAME,TABLE通过查询information_schema库中的tables DeviceType | tinyint(3) unsigned | YES | | NULL | | | VideoInputNum | tinyint(3) unsigned | YES | | NULL | | | VideoCodecCapacity如果结构

GO 学习笔记(四)struct 结构、slice

1.struct结构,字段集合. 2.字段使用点号来访问. 3.字段可以通过指针来访问. func main() { row1 := []User{ User{"man1", 22, true}, User{"man2", 23, true}, } fmt.Println(row1) // [{man1 22 true} {man2 23 true}] user := User{"man", 18, true} fmt.Println(user)

struct 结构体以及 typedef struct

1.C语言中,结构体的声明如下:首先关键字struct表示接下来是一个结构,后面是一个可选的标记,用来引用该结构的快速标记. struct book { char title[MAXN]; char author[MAXM]; float value; }; 上述结构声明,是"结构设计"的意思.它告诉编译器如何表示数据,而没有让计算机为数据分配空间. 然后声明或定义一个结构体变量时,如下: struct book library; 其中struct 不能省. 综合上述的两个,可以合二为