我有以下简单代码
holder.toggle.setChecked(search.get(position).isChecked())
它输出的组件是
反汇编.text:
void test() {
char buffer[20];
return 0;
}
int main() {
test();
}
我猜测这个组件的缓冲区大小?堆栈看起来似乎并不多。
答案 0 :(得分:0)
您可以使用https://godbolt.org/实时浏览C ++源代码的生成机器代码:
(我使用英特尔语法..如果关闭则切换,如果你想要AT& T)
void test() {
char buffer[400];
buffer[0] = 0;
return;
}
编译为:
test():
; {
push rbp
mov rbp, rsp
sub rsp, 280 ; reserves more space at stack for local variables
; buffer[0] = 0;
mov BYTE PTR [rbp-400], 0
; return; .. sort of .. or just padding
nop
; }
leave
ret
一个正确的C编译器不会试图“继续”很多,而是尝试用最少量的指令来实现C源的所有已定义/期望的行为......实际上我认为具有足够高的优化级别它将完全删除test()
调用,因为它不会执行任何操作并且编译器知道它。
编辑:是的,使用-O3,gcc只会为整个rep ret
生成test()
。作品。 (rep
用于较旧的AMD CPU,当单ret
跟随某些条件分支跳转后,不会阻塞预取队列...您可以将其视为简单ret
,它只是额外的垃圾字节到make ret
2字节操作码。