2017-02-21 43 views
2

у меня есть следующие Пакетирование и кучного выделяются переменные:Почему размер указателя на что-то на куче больше, чем размер переменной стека?

let var1 = 10; 
let var2 = Box::new(10); 

Печать этих выходов такое же значение, 10:

println!("var1 ={} var2 ={}", var1, * var2); 

Когда я проверить размер с помощью mem::size_of_val(), var1 равно 4 и var2 составляет 8.

Не является var2 указателем на кучу? Почему указатель будет больше, чем переменная стека (var1)?

Кроме того, является использование «*» (то есть, *var2) в println!() предполагается делать что-то другое? Я получаю 10 в любом случае.

ответ

8

Вы не дали код для вызова mem::size_of_val, но я предполагаю, что вы делаете это:

println!("var1 size = {}", mem::size_of_val(&var1)); // 4 
println!("var2 size = {}", mem::size_of_val(&var2)); // 8 

Размер var1 является размером с i32 (4 байта), в то время как размер var2 - это размер Box, который является всего лишь указателем (это было бы два указателя, если бы это был объект объекта). Указатель всегда равен usize (8 байтов в 64-битной системе).

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

println!("var2 size = {}", mem::size_of_val(&*var2)); // 4 

Кроме того, является использование «*» (т.е. , *var2) в println!() предполагается делать что-нибудь другое? Я получаю 10 в любом случае.

println! представляет собой особый случай, наряду с format! и несколько других. Он всегда будет ссылаться на переменные, которые вы передаете ему, а затем будет разыменовывать их столько раз, сколько необходимо для получения значения. См. this answer для более подробной информации.

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

  • Нет связанных вопросов^_^