为什么堆上某些东西的指针大小大于堆栈变量的大小?

时间:2017-02-21 03:57:39

标签: pointers reference rust smart-pointers memory-layout

我有以下堆栈和堆分配的变量:

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

打印这些输出相同的值10

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

当我使用mem::size_of_val()检查尺寸时,var1为4,var2为8。

Isn' t var2指向堆的指针?为什么指针大于堆栈变量(var1)?

此外,使用" *" (*var2println!()中的 If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Me.RichTextBox1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText) End If 应该做些什么?无论如何,我得到10分。

1 个答案:

答案 0 :(得分:10)

您没有显示关于如何调用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(64位系统上为8个字节)。

如果您首先取消引用该框,那么该尺寸将是该框的内容,并且您将获得您期望的结果:

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

此外,使用" *" (*var2println!()中的println!应该做些什么?无论如何,我得到10分。

format!宏以及&和其他一些内容将始终在var App = Vue.extend({}); var postList = Vue.extend({ template:'#post-list-template', data: function(){ return { posts: '' } }, ready: function(){ posts = this.$resource('/wp-json/wp/v2/posts?per_page=20'); posts.get(function(posts){ this.$set('posts', posts); }) } }) var router = new VueRouter({ routes: [ { path: '/', component: postList } ] }) new Vue({ el: '#app', router: router, template: '<router-view></router-view>' }) **index.php**前加上一个值,以确保它被借用,而不是移动或复制。当需要该值时,它将根据需要自动解除引用次数。有关详细信息,请参阅this answer