实现特定std::mbstate_t的大小

Size of implementation specific std::mbstate_t

本文关键字:mbstate std 实现      更新时间:2023-10-16

这方面的文档相当缺乏,所以我希望社区可以运行一个简单的测试并在这里发布结果,这样我和其他人就可以有参考了。

#include <cwchar>
sizeof( std::mbstate_t );

如果你能在这里发布结果,并提到你正在使用的编译器,我将不胜感激。

在VS2010上,它被声明为typedef int mbstate_t;,对于32位和64位构建,它的大小都是4字节。

我这么问是因为mbstate_tstreampos的成员。我需要使用此成员来存储编码的转换状态。我能逃脱的最小空间是3个字节,所以我需要知道是否有任何实现会破坏我的代码。

提前谢谢。

gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3在x86_64 上

size = 8

armv7l 上的gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

size = 8

您只想知道sizeof的结果吗?

Qt 5.1与GCC x86 32位在Debian下:

size=8

来自C11规范(7.29.1/2):

   mbstate_t

它是一个完整的对象类型,而不是可以保持转换状态的数组类型在多字节字符序列和宽字符序列之间转换所需的信息字符;

所以,虽然我错了,is可以是一个数组,但它可以是其他任何东西(包括包含数组的结构)。规范中的语言没有说明它应该如何实现,只是说它是"一个完整的对象类型,而不是数组类型"。


来自C++11规范(多个位置,例如21.2.3.1/4):

类型mbstate_t<cwchar>中定义,并且可以表示在实现定义的一组支持的多字节字符编码规则中可能发生的任何转换状态。


总之,如果您希望可移植,则可以而不是依赖于mbstate_t是整数类型或特定大小。如果你想具有可移植性,你必须让标准库为你管理状态。