实现特定std::mbstate_t的大小
Size of implementation specific std::mbstate_t
这方面的文档相当缺乏,所以我希望社区可以运行一个简单的测试并在这里发布结果,这样我和其他人就可以有参考了。
#include <cwchar>
sizeof( std::mbstate_t );
如果你能在这里发布结果,并提到你正在使用的编译器,我将不胜感激。
在VS2010上,它被声明为typedef int mbstate_t;
,对于32位和64位构建,它的大小都是4字节。
我这么问是因为mbstate_t
是streampos
的成员。我需要使用此成员来存储编码的转换状态。我能逃脱的最小空间是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
是整数类型或特定大小。如果你想具有可移植性,你必须让标准库为你管理状态。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选