Размер конкретной реализации std :: mbstate_t

Документов по этому вопросу довольно не хватает, поэтому я надеюсь, что сообщество сможет провести простой тест и опубликовать здесь результаты, чтобы у меня и у всех остальных была ссылка.

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

Если бы вы могли опубликовать результаты здесь, а также упомянуть, какой компилятор вы используете, я был бы очень признателен.

На VS2010 он объявлен как typedef int mbstate_t; и его размер составляет 4 байта для 32- и 64-битных сборок.

Я спрашиваю это, потому что mbstate_t является членом streampos, Мне нужно использовать этот элемент для хранения состояния преобразования кодировки. Минимальное пространство, которое я могу выделить, составляет 3 байта, поэтому мне нужно знать, не нарушит ли моя реализация какую-либо реализацию.

Заранее спасибо.

0

Решение

gcc (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3 на x86_64

size = 8

gcc (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3 на armv7l

size = 8
1

Другие решения

Вы просто хотите знать результаты размер?

Qt 5.1 с GCC x86 32bit под Debian:

размер = 8

1

Из спецификации C11 (7.29.1 / 2):

   mbstate_t

который является полным типом объекта, отличным от типа массива, который может содержать состояние преобразования
информация, необходимая для преобразования между последовательностями многобайтовых символов и широкими
персонажи;

Так что, хотя я был неправ в том, что это может быть массив, это может быть что-то еще (включая структуру содержащий массив). Язык в спецификации не говорит что-нибудь о том, как это должно быть реализовано, просто о том, что это «полный тип объекта, отличный от типа массива».


Из спецификации C ++ 11 (несколько мест, например 21.2.3.1/4):

Тип mbstate_t определяется в <cwchar> и может представлять любое из состояний преобразования, которые могут встречаться в заданном реализацией наборе поддерживаемых правил многобайтового кодирования символов.


В заключение вы можете не полагаться на mbstate_t будучи целочисленным типом или определенного размера, если вы хотите быть переносимым. Если вы хотите быть переносимым, вы должны позволить стандартной библиотеке управлять состоянием за вас.

0
По вопросам рекламы [email protected]