打包数据类型与普通数据类型之间的区别
Posted
技术标签:
【中文标题】打包数据类型与普通数据类型之间的区别【英文标题】:Difference between packed vs normal data type 【发布时间】:2016-12-10 23:00:24 【问题描述】:在 Metal 中,packed_float4
和 float4
有什么区别?
【问题讨论】:
developer.apple.com/library/ios/documentation/Metal/Reference/… 我已阅读该文档。它没有告诉您什么是打包数据类型。它只是透露它们在 Metal 中可用。 【参考方案1】:此信息来自here
float4
具有16
字节的对齐方式。这意味着这种类型的内存地址(例如0x12345670
)可以被16
整除(也就是最后一个十六进制数字是0
)。
另一方面,packed_float4
的对齐方式为4 bytes
。地址的最后一位数字为0
、4
、8
或c
当您创建自定义结构时,这很重要。假设您想要一个具有 2 个普通 float
s 和 1 个 float4
/packed_float4
的结构:
struct A
float x, y;
float4 z;
struct B
float x, y;
packed_float4 z;
对于A
:float4
的对齐方式必须是16
,并且由于float4
必须在正常的float
s 之后,因此@ 之间将有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
对于B
:packed_float4
的对齐方式是4
,与float
相同,因此无论如何它都可以紧跟在float
s 之后:
Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 |
Content | x | y | z1 | z2 | z3 | z4 |
如您所见,A
占用 32
字节,而 B
仅使用 24
字节。当您拥有这些结构的数组时,A
将为每个元素占用8
更多字节。所以为了传递大量数据,后者是首选。
您根本需要float4
的原因是因为GPU 无法处理4
字节对齐packed_float4
s,您将无法在着色器中返回packed_float4
。这是因为我假设的性能。
最后一件事:当你声明一个结构体的 Swift 版本时:
struct S
let x, y: Float
let z : (Float, Float, Float, Float)
这个结构将等于 Metal 中的 B
而不 A
。元组就像packed_floatN
。
所有这些也适用于其他矢量类型,例如 packed_float3
、packed_short2
等。
【讨论】:
以上是关于打包数据类型与普通数据类型之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
[python基础] python 2与python 3之间的区别 —— 不同数据类型间的运算
C 语言指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )