当 UTF-8 压入堆栈时,是否使用与 UTF-32 相同的内存量?

Sha*_*jun 1 unicode x86 assembly utf-8 nasm

问题具体在于 UTF-8 在堆栈上占用了多少空间,因此在内存 (RAM) 中占用了多少空间,例如:它与 UTF-32 相同吗?因此,这与 UTF-8 序列化为文件时占用多少磁盘空间无关。如果这种消除歧义的尝试侮辱了你的智力,我很抱歉。

  • 堆栈始终位于 RAM 中。所以我放入堆栈的任何内容都会占用 RAM 中的空间。

/sf/ask/1080337331/#:~:text=Stack%20is%20always%20in%20RAM,at%20the%20top%20of%20stack

  • 堆栈在 x86 上至少为 32 位,在 x86_64 上至少为 64 位。因此,无论我将一字节字符还是三字节字符压入堆栈,它们都至少占用内存中的 32 位。我想这就是 UTF-32 所发生的情况,它在堆栈上占用 32 位。

当我不指定操作数大小时,push 指令将多少字节压入堆栈?

那么,当他们说 UTF-32 比 UTF-8 占用更多内存时,他们是什么意思呢?

编辑

UTF-32 使用更多内存,但当今的计算机配备了大量内存。节省内存的压力消失了,简单快速地处理 UTF-32 字符串超过了增加的内存使用量。与任何试图通过检查字符串来节省内存的方法相比,使用 UTF-32 可以使程序运行得更快。

https://seed7.sourceforge.net/faq.htm#unicode

Pet*_*des 5

在奇怪的情况下,您有push多个单独的 UTF-8 编码单元(字节),是的,每个 UTF-8 数据字节将使用 8 字节的堆栈空间。但仅限于这种情况。

这是非常低效的,这就是为什么人们不以这种方式编写代码的原因(除了一些使用堆栈反转短字符串的简单初学者示例,作为理解入栈/出栈的后进先出顺序的学习练习)。

如果要在堆栈空间中存储字符串数据,则需要保留一些空间(如本地char数组)并使用它,而不是将字节或双字解包为 qword。//复制sub rsp, 64+816个字节(UTF-32 或 UTF-8 数据,无论是哪一个)movdqu xmm0, [rsi]movdqa [rsp], xmm0

如果您确实想使用推送,则可以push qword [rdi+rcx]在推送时一次复制 8 个字节,从源字符串的末尾向后计数,以便字符串以与源相同的顺序结束在堆栈上。

访问数据时,可以使用mov eax, [rsp + rcx*4]UTF-32(或者最好是指针增量,但比例因子有助于说明寻址)。或者对于 UTF-8 movzx eax, byte [rsp + rcx](如果您想将 unicode 代码点获取到 EAX 中,则使用一个循环来检查多字节字符并可能加载更多字节)。将 UTF-8 的每个字节解包为 8 个字节毫无意义,并且会更难有效处理多字节字符。例如,使用 8 字节负载和 BMI2pext进行打包,并且可能andn//找到多字节字符的结尾(高位清零的字节)并将其上方的垃圾清零tzcntbzhi


对于处理字符串数据的常规方法(以与磁盘上相同的方式打包),对于 Unicode 的 ASCII 子集,UTF-8 比 UTF-32 小 4 倍。 对于具有一些 2 和 3 字节重音字符但仍然主要是 1 字节字符的西方语言来说,它仍然要小得多。对于大多数字符在 UTF-8 中长度为 3 个或更多字节的语言,UTF-32 不会占用更多空间。(与 UTF-32 的每个双字相比,将 UTF-8 的每个字节扩展为 8 个字节将使 UTF-8 占用更多空间。)

在输入时转换为 UTF-32,在输出时转换回 UTF-8 是有意义的。然后我们又回到了过去的美好时光,字符具有固定大小,因此数组索引可以为我们提供第 n 个字符(与 UTF-8 和 UTF-16 等可变长度编码分开的模 Unicode 恶作剧)。这确实增加了空间使用量,包括缓存占用空间,尤其是对于西方语言。RAM 很便宜,但缓存占用空间和内存带宽却不便宜。所以这并不总是最好的策略。

  • @ShaggyInjun:“解包方案”不是一个技术术语,只是一个英语短语,用于描述将每个字节(或字符?)扩展到 qword 之类的东西。是的,有多种方法可以每 8 个字节存储多个字符...例如 UTF-32 将每个字符存储在 4 个字节中,因此每 8 个字节存储 2 个字符。如果您不知道如何创建元素大小不是 8 字节的数组,请查看优化的 C 编译器输出,例如 https://godbolt.org/z/rsbj3YdWf 使用“char”数组。([如何从 GCC/clang 程序集输出中删除“噪音”?](/sf/ask/2698648151/)) (2认同)