2016-04-03 5 views
4

Этот код показывает, что char занимает 4 байта:Почему размер `char` 4 байта в Rust?

println!("char : {}", std::mem::size_of::<char>()); 
  1. Почему занимают 4 байта ?.
  2. Размер зависит от платформы, или это всегда 4 байта?
  3. Если это всегда 4 байта, это для чего-то особенного?
  4. Предоставляет ли компилятор минимальный размер для char?

В https://play.rust-lang.org/ я также получаю 4 байта

ответ

7

Прежде всего: в Русте char является уникальным интегральным значением, представляющим значения Unicode Скалярного. Например, рассмотрим (иначе куча Poo, он же U + 1F4A9), в Rust будет представлен char со значением 128169 в десятичной системе (т.е. в шестнадцатеричном 0x1F4A9):

fn main() { 
    let c: char = "".chars().next().unwrap(); 
    println!(" is {} ({})", c, c as u32); 
} 

On the playpen.

С учетом этого, ржавчина char составляет 4 байта, поскольку 4 байта - это наименьшая мощность 2 байтов, которые могут удерживать интегральное значение любого значения Scicar Unicode. Решение было обусловлено доменом, а не архитектурными ограничениями.


Примечание: акцент на значении скаляра является то, что число «героев», как мы видим их на самом деле графемы состоит из нескольких несамостоятельных символов в Unicode, в этом случае множественного char требуется.

3

char четыре байта. Это всегда четыре байта, он всегда будет be четыре байта. Четыре байта, и четыре байта остаются.

Это не для чего-то особенного; четыре байта - это наименьшая мощность, в которой вы можете хранить любое скалярное значение Unicode. Различные другие языки делают то же самое.

2

Char - это четыре байта, это не зависит от архитектуры.

Почему? Согласно статье Википедии UTF-8.

Первые 128 символов (US-ASCII) нуждаются в одном байте. Следующие символы 1920 нуждаются в двух байтах для кодирования. Три байта необходимы для символов в остальной части базовой многоязычной плоскости, которая содержит практически всех используемых символов. Четыре байта необходимы для символов в других плоскостях Unicode.

Так что, если вы хотите, чтобы представить любой возможный символ Unicode компилятор должен сохранить 4 байта.

Вы должны также рассмотреть Byte Alignment: http://www.eventhelix.com/realtimemantra/ByteAlignmentAndOrdering.htm

+2

Обратите внимание, что 'char' не хранит кодовую точку UTF-8. 'char' на самом деле является точкой кода UTF-32, то есть просто сканирующим значением Unicode. –

+0

Я действительно видел это поведение, смотря на выравнивание структуры, я думал, в магазинах char, только ASCII, но я вижу, что нет –

+0

тем более удивительно, что в этом свете представлены предложенные здесь теории: https: //doc.rust-lang .org/std/primitive.char.html, а именно: «Как всегда, помните, что человеческая интуиция для« персонажа »может не отображаться в определениях Unicode. Например, символы emoji, такие как« ❤️ », могут быть более одного Unicode кодовая точка, в частности, это два: «<- В UTF-32 у вас есть только 1 кодовая точка для всего ... – BitTickler

Смежные вопросы