打包数据类型与普通数据类型之间的区别

Posted

技术标签:

【中文标题】打包数据类型与普通数据类型之间的区别【英文标题】:Difference between packed vs normal data type 【发布时间】:2016-12-10 23:00:24 【问题描述】:

在 Metal 中,packed_float4float4 有什么区别?

【问题讨论】:

developer.apple.com/library/ios/documentation/Metal/Reference/… 我已阅读该文档。它没有告诉您什么是打包数据类型。它只是透露它们在 Metal 中可用。 【参考方案1】:

此信息来自here

float4 具有16 字节的对齐方式。这意味着这种类型的内存地址(例如0x12345670)可以被16整除(也就是最后一个十六进制数字是0)。

另一方面,packed_float4 的对齐方式为4 bytes。地址的最后一位数字为048c

当您创建自定义结构时,这很重要。假设您想要一个具有 2 个普通 floats 和 1 个 float4/packed_float4 的结构:

struct A
    float x, y;
    float4 z;


struct B
    float x, y;
    packed_float4 z;

对于Afloat4 的对齐方式必须是16,并且由于float4 必须在正常的floats 之后,因此@ 之间将有8 字节的空白空间987654343@ 和z。这是A 在内存中的样子:

 Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 | 0x218 | 0x21c |
 Content |   x   |   y   |   -   |   -   |   z1  |   z2  |   z3  |   z4  |
                                             ^Has to be 16 byte aligned

对于Bpacked_float4 的对齐方式是4,与float 相同,因此无论如何它都可以紧跟在floats 之后:

 Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 |
 Content |   x   |   y   |   z1  |   z2  |   z3  |   z4  |

如您所见,A 占用 32 字节,而 B 仅使用 24 字节。当您拥有这些结构的数组时,A 将为每个元素占用8 更多字节。所以为了传递大量数据,后者是首选。

您根本需要float4 的原因是因为GPU 无法处理4 字节对齐packed_float4s,您将无法在着色器中返回packed_float4。这是因为我假设的性能。

最后一件事:当你声明一个结构体的 Swift 版本时:

struct S 
    let x, y: Float
    let z : (Float, Float, Float, Float)

这个结构将等于 Metal 中的 B A。元组就像packed_floatN

所有这些也适用于其他矢量类型,例如 packed_float3packed_short2 等。

【讨论】:

以上是关于打包数据类型与普通数据类型之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

JS中基本数据类型与引用数据类型的区别:

js中基本数据类型与引用数据类型的本质区别

[python基础] python 2与python 3之间的区别 —— 不同数据类型间的运算

C++中函数模板和模板函数的区别

C 语言指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

2第八周 - 网络编程进阶 - 数据库类型的理解