相关疑难解决方法(0)

结构填料和包装

考虑:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;
Run Code Online (Sandbox Code Playgroud)

结构的尺寸分别为12和8.

这些结构是填充还是包装?

什么时候进行填充或包装?

c struct structure packing padding

189
推荐指数
6
解决办法
25万
查看次数

为什么GCC不优化结构?

系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.

我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?

我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).

c optimization gcc struct

46
推荐指数
4
解决办法
9205
查看次数

对齐对C++ 11的性能是否真的重要?

对齐对C++ 11的性能是否真的重要?

在Stroustrup的书中有一条建议,要求从最大到最小的结构中对成员进行排序.但我想知道是否有人进行了测量,以确定是否会产生任何影响,并且在编写代码时是否值得考虑.

c++ memory-alignment c++11

38
推荐指数
2
解决办法
3756
查看次数

使用pragma pack(1)时是否存在性能问题?

我们的头文件用于#pragma pack(1)大多数结构(用于网络和文件I/O).据我所知,它将结构的对齐方式从默认的8个字节更改为1个字节的对齐方式.

假设一切都在32位Linux(也许是Windows)中运行,那么这种打包对齐是否会带来任何性能损失?

我不关心库的可移植性,但更关注文件和网络I/O与不同#pragma包的兼容性以及性能问题.

c gcc

13
推荐指数
2
解决办法
5078
查看次数

当base + offset与基数不同时,是否存在惩罚?

这三个片段的执行时间:

pageboundary: dq (pageboundary + 8)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx - 8]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

还有这个:

pageboundary: dq (pageboundary - 8)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx + 8]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

还有这个:

pageboundary: dq (pageboundary - 4096)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx + 4096]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

对于第一个片段,在4770K上,每次迭代大约5个周期,对于第二个片段,每次迭代大约9个周期,然后是第三个片段的5个周期.它们都访问完全相同的地址,这是4K对齐的.在第二个片段中,只有地址计算跨越页面边界:rdx并且rdx + 8不属于同一页面,负载仍然是对齐的.如果偏移量很大,则会再次回到5个周期.

这种效果一般如何起作用?


通过ALU指令从加载路由结果,如下所示:

.loop:
    mov rdx, …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly micro-optimization

11
推荐指数
1
解决办法
456
查看次数

班级成员的顺序会影响访问速度吗?

我正在编写一个应该绝对没有开销的委托库。因此,尽可能快地访问函数指针很重要。

所以我的问题是:访问速度是否取决于班级中的成员位置?我听说最重要的成员应该是成员声明中的第一个成员,这对我来说很有意义,因为这意味着this类的指针指向与重要成员相同的地址(假设是非虚拟类)。而如果重要成员将在任何其他位置,CPU 将不得不通过添加this和类布局中的偏移量来计算它的位置。

另一方面,我知道编译器将该地址表示为 a qword-ptr,其中包含偏移量的信息。

所以我的问题归结为:解决 a 是否qword-ptr需要一个恒定的时间,或者如果偏移量不是,它会增加0吗?行为在不同平台上是否保持相同?

c++ performance micro-optimization class-members addressing-mode

3
推荐指数
1
解决办法
127
查看次数