Документов по этому вопросу довольно не хватает, поэтому я надеюсь, что сообщество сможет провести простой тест и опубликовать здесь результаты, чтобы у меня и у всех остальных была ссылка.
#include <cwchar>
sizeof( std::mbstate_t );
Если бы вы могли опубликовать результаты здесь, а также упомянуть, какой компилятор вы используете, я был бы очень признателен.
На VS2010 он объявлен как typedef int mbstate_t;
и его размер составляет 4 байта для 32- и 64-битных сборок.
Я спрашиваю это, потому что mbstate_t
является членом streampos
, Мне нужно использовать этот элемент для хранения состояния преобразования кодировки. Минимальное пространство, которое я могу выделить, составляет 3 байта, поэтому мне нужно знать, не нарушит ли моя реализация какую-либо реализацию.
Заранее спасибо.
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
Вы просто хотите знать результаты размер?
Qt 5.1 с GCC x86 32bit под Debian:
размер = 8
Из спецификации C11 (7.29.1 / 2):
mbstate_t
который является полным типом объекта, отличным от типа массива, который может содержать состояние преобразования
информация, необходимая для преобразования между последовательностями многобайтовых символов и широкими
персонажи;
Так что, хотя я был неправ в том, что это может быть массив, это может быть что-то еще (включая структуру содержащий массив). Язык в спецификации не говорит что-нибудь о том, как это должно быть реализовано, просто о том, что это «полный тип объекта, отличный от типа массива».
Из спецификации C ++ 11 (несколько мест, например 21.2.3.1/4):
Тип
mbstate_t
определяется в<cwchar>
и может представлять любое из состояний преобразования, которые могут встречаться в заданном реализацией наборе поддерживаемых правил многобайтового кодирования символов.
В заключение вы можете не полагаться на mbstate_t
будучи целочисленным типом или определенного размера, если вы хотите быть переносимым. Если вы хотите быть переносимым, вы должны позволить стандартной библиотеке управлять состоянием за вас.