genius_platform软件平台开发】第十七讲:数据成员不同位置的访问效率

本文探讨了结构体或类中数据成员的位置对其访问效率的影响。当成员的偏移量小于128字节时,访问更高效。作者通过实例展示了大数组与常用数据成员的顺序如何影响汇编代码的紧凑性和Cache利用率,并建议将最常用的数据成员置于结构或类的前面,以优化性能。
摘要由CSDN通过智能技术生成
// 类的数据成员.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>

//
// 1. 验证数据成员不同位置访问效率
/*
如果成员相对于结构体或类开头的偏移量小于128,则访问数据成员的代码会更紧凑,因为该偏移量可以表示为8位有符号的数字。如果相对于结构体或类的开头的偏移量是128字节或更大,那么偏移量必须表示为一个32位数字(指令集在8位到32位之间没有偏移量)

 b的偏移量是400。任何通过指针或成员函数(如ReadB)访问b的代码,都需要将偏移量编码为32位数字。如果交换了a和b,则两者都可以通过编码为8位有符号数字的偏移量来访问,或者根本没有偏移量。这使代码更紧凑,以便更有效地使用Cache。因此,建议在结构或类声明中,大数组和其他大对象排在最后,最常用的数据成员排在前面。如果不能在前128个字节内包含所有数据成员,则将最常用的成员放在前128个字节中

 结论:
  1.1 查看汇编代码发现指令其实都是一样的

MyStruct obj;
memset(obj.a, 0, 2*1000);
  005C3C9C  push        7D0h
  005C3CA1  push        0
  005C3CA3  lea         eax,[obj]
  005C3CA9  push        eax
  005C3CAA  call        _memset (05C1078h)
  005C3CAF  add         esp,0Ch
obj.b = 1.0;
  005C3CB2  movsd       xmm0,mmword ptr ds:[5C5860h]
  005C3CBA  movsd       mmword ptr [ebp-18h],xmm0
obj.c = 1;
  005C3CBF  mov         dword ptr [ebp-10h],1

MyStruct2 obj2;
memset(obj2.a, 0, 2 * 1000);
  005C3CC6  push        7D0h
  005C3CCB  push        0
  005C3CCD  lea         eax,[ebp-0FC4h]
  005C3CD3  push        eax
  005C3CD4  call        _memset (05C1078h)
  005C3CD9  add         esp,0Ch
obj2.b = 2.0;
  005C3CDC  movsd       xmm0,mmword ptr ds:[5C5868h]
  005C3CE4  movsd       mmword ptr [obj2],xmm0
obj2.c = 2;
  005C3CEC  mov         dword ptr [ebp-0FC8h],2

*/

// 结构体1
struct MyStruct     
{
    short a[1000];
    double b;
    int c;
};

// 结构体2
struct MyStruct2
{
    double b;
    int c;
    short a[1000];
};

//
//
int _tmain(int argc, _TCHAR* argv[])
{
    MyStruct obj;
    memset(obj.a, 0, 2*1000);
    obj.b = 1.0;
    obj.c = 1;

    MyStruct2 obj2;
    memset(obj2.a, 0, 2 * 1000);
    obj2.b = 2.0;
    obj2.c = 2;

    system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值