特定于std :: mbstate_t的实现大小

时间:2013-07-24 06:35:01

标签: c++ c c++11 compiler-specific

关于这方面的文档相当缺乏,所以我希望社区可以运行一个简单的测试并在此发布结果,以便我和其他任何人都有参考。

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

如果您可以在此处发布结果并提及您正在使用的编译器,我将非常感激。

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

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

提前致谢。

3 个答案:

答案 0 :(得分:1)

gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3 on x86_64

size = 8

gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3 on armv7l

size = 8

答案 1 :(得分:1)

您只想知道 sizeof 的结果?

在Debian下使用GCC x86 32位的Qt 5.1:

size = 8

答案 2 :(得分:0)

根据C11规范(7.29.1 / 2):

   mbstate_t
     

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

因此,虽然我错了,但它可以是一个数组,它可能是其他任何东西(包括一个包含数组的结构)。规范中的语言没有说明任何应该如何实现它,只是它是“除了数组类型之外的完整对象类型”。


从C ++ 11规范(多个地方,例如21.2.3.1/4):

  

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


总之,如果您想要可移植,那么可以依赖mbstate_t作为整数类型或特定大小。如果您想要便携,则必须让标准库为您管理状态。