深度搜索c++模型中“在同一个access section中,member的排列只符合“较晚出现的members 在class object中有较高的地址””怎么理解
深度搜索c++模型中“在同一个access section中,member的排列只符合“较晚出现的members 在class object中有较高的地址””如何理解?
data members不是存放在栈中?栈是从高地址往低地址存放的,那么RT那句如何解释?
------解决方案--------------------
(1)对象当然不一定放在栈上。比如使用new动态分配的对象就不会放在栈上;
(2)栈地址从高到低增长,不代表当在栈上布局对象时,各个字段也按从高到低的顺序排列。这完全是两码事。栈从高往低增长,只能说明当你用汇编语句连续调用两次push指令时,后一个对象被push到较低的地址。而对于高级语言来说,程序中的各条编量定义语句,最终被编译器生成了什么顺序的机器指令是不一定的,编译器如何布局同一个对象的各个字段更是由编译器决定的,而不是由栈的特点决定的;因此,就算栈从高往低增长,那编译器在排布对象时依然可以把对象中前面的字段放在较低地址上,可能这使你认为编译器反着排布对象成员,但没关系,只要它内部的各种操作彼此保持统一,无所谓“正反”。
(3)“栈从高地址往低增长”——这一点并不是绝对真理。而只是在某几种常见的系统平台上是这样的。
------解决方案--------------------
在栈上分配内存没错,栈是从高到底的顺序存储也没错。
你的理解错误在于:在堆栈上给结构体或者说类对象分配内存是按整个大小来一次性分配的。而不是根据结构体里面的成员一个一个来分配。
data members不是存放在栈中?栈是从高地址往低地址存放的,那么RT那句如何解释?
------解决方案--------------------
(1)对象当然不一定放在栈上。比如使用new动态分配的对象就不会放在栈上;
(2)栈地址从高到低增长,不代表当在栈上布局对象时,各个字段也按从高到低的顺序排列。这完全是两码事。栈从高往低增长,只能说明当你用汇编语句连续调用两次push指令时,后一个对象被push到较低的地址。而对于高级语言来说,程序中的各条编量定义语句,最终被编译器生成了什么顺序的机器指令是不一定的,编译器如何布局同一个对象的各个字段更是由编译器决定的,而不是由栈的特点决定的;因此,就算栈从高往低增长,那编译器在排布对象时依然可以把对象中前面的字段放在较低地址上,可能这使你认为编译器反着排布对象成员,但没关系,只要它内部的各种操作彼此保持统一,无所谓“正反”。
(3)“栈从高地址往低增长”——这一点并不是绝对真理。而只是在某几种常见的系统平台上是这样的。
------解决方案--------------------
在栈上分配内存没错,栈是从高到底的顺序存储也没错。
你的理解错误在于:在堆栈上给结构体或者说类对象分配内存是按整个大小来一次性分配的。而不是根据结构体里面的成员一个一个来分配。