c++ 使用杂注包时是否存在速度问题?

k10s72fa  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(112)
struct window_data
{
    window_props win_props;
    bool VSync;

    Window::event_callback_fn EventCallback;
};

我的程序中有一个结构体。sizeof(window_data)等于120。

#pragma pack(push, 2)
struct window_data
{
    window_props win_props;
    bool VSync;

    Window::event_callback_fn EventCallback;
};
#pragma pack(pop)

如果我使用#pragma pack(push,2),那么sizeof(window_data)等于114。

#pragma pack(push, 1)
struct window_data
{
    window_props win_props;
    bool VSync;

    Window::event_callback_fn EventCallback;
};
#pragma pack(pop)

在本例中,大小(窗口数据)等于113。
那么,用最新的病例有问题吗?

tf7tbtn2

tf7tbtn21#

在正常情况下,如果没有杂注,编译器会使用填充来布局结构,以便字段正确对齐。例如,EventCallback可能是一个64位指针,因此其地址应该在8字节边界上对齐。
使用杂注时,字段可能最终无法对齐。根据CPU的不同,这可能意味着使用不同的加载/存储指令来访问字段,或者使用正常指令并降低其性能。
作为对这种降低的CPU性能访问结构的交换,有几个好处。压缩结构有一个更可预测的布局,有时直接用于序列化数据,或使用内存MapIO访问硬件。它们还占用更少的空间,这可能有助于您的程序适合RAM,或有助于您的工作集适合缓存。在某些情况下,这种权衡是值得的CPU损失。
除非你有特别的理由,否则你不应该打包。如果你这样做是为了获得性能上的好处,那么测量一下,确认它实际上更好。

相关问题