官术网_书友最值得收藏!

Heaps and stacks

As we discussed in Chapter 1, Hello Rust!, stack variables are preferred thanks to their low overhead and speed compared to heap-allocated data, which automatically introduces overhead thanks to the necessary heap pointer. For stack variables, Rust's types even allow for zero overhead structures, so no additional metadata is stored. The following snippet asserts that there are no additional bytes being used for arrays or user-defined types:

use std::mem;

struct MyStruct {
a: u8,
b: u8,
c: u8
}

fn main() {
assert_eq!(mem::size_of::<MyStruct>(), 3 * mem::size_of::<u8>());
assert_eq!(mem::size_of::<[MyStruct; 2]>(), 3 * mem::size_of::<u8>() * 2);
}

Consequently, the size of an instance of the MyStruct type is always going to be three bytes—perfectly suitable for placing it on the stack. Why is that good? In short, data locality. Instead of pointer dereferencing, the data is stored right at the point of execution, making it easy to cache and fast to access.

Types that don't have predictable sizes (such as String instances) require heap allocation, just like objects that are wrapped into Rc, Cell, RefCell, or Box instances. However, heap allocations and access come at a considerable cost, as minimizing those typically yields great performance improvements.

主站蜘蛛池模板: 高陵县| 衡东县| 星子县| 凭祥市| 开鲁县| 江孜县| 周宁县| 张家口市| 淳化县| 仙游县| 股票| 桐乡市| 阆中市| 岳普湖县| 缙云县| 吴堡县| 皋兰县| 寻乌县| 弋阳县| 清涧县| 皮山县| 昆明市| 浦北县| 古蔺县| 广安市| 来宾市| 获嘉县| 新化县| 宜春市| 英德市| 依安县| 新野县| 托克托县| 孟连| 米易县| 新泰市| 尚义县| 达日县| 和平县| 多伦县| 丹棱县|