tôi biên soạn mã C sau:về mã gcc-biên soạn x86_64 và tối ưu hóa mã C
typedef struct {
long x, y, z;
} Foo;
long Bar(Foo *f, long i)
{
return f[i].x + f[i].y + f[i].z;
}
với lệnh gcc -S -O3 test.c
. Đây là chức năng Bar trong đầu ra:
.section __TEXT,__text,regular,pure_instructions
.globl _Bar
.align 4, 0x90
_Bar:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
leaq (%rsi,%rsi,2), %rcx
movq 8(%rdi,%rcx,8), %rax
addq (%rdi,%rcx,8), %rax
addq 16(%rdi,%rcx,8), %rax
popq %rbp
ret
Leh_func_end1:
Tôi có một số câu hỏi về mã lắp ráp này:
- mục đích "
pushq %rbp
", "movq %rsp, %rbp
", và "popq %rbp
" là gì, nếu không phảirbp
cũng không phảirsp
được sử dụng trong phần thân của hàm? - Tại sao
rsi
vàrdi
tự động chứa đối số cho hàm C (i
vàf
tương ứng) mà không đọc chúng từ ngăn xếp? Tôi đã thử tăng kích thước của Foo lên 88 byte (11
long
s) và hướng dẫnleaq
trở thànhimulq
. Nó sẽ làm cho tinh thần để thiết kế cấu trúc của tôi để có kích thước "tròn" để tránh các hướng dẫn nhân (để tối ưu hóa truy cập mảng)? Các hướng dẫnleaq
được thay thế bằng:imulq $88, %rsi, %rcx
Tôi đã đăng mã tôi nhận được. – Matt
Có, tôi biết tất cả điều đó. Câu hỏi của tôi là nó có giá trị đệm cấu trúc với không gian thêm chỉ để làm cho nó một số "tròn" (như 12 longs thay vì 11 longs) mà sẽ tránh sử dụng một nhân trong tính toán chỉ số mảng? – Matt
@Matt: không ai có thể trả lời rằng nói chung - padding không đến miễn phí hoặc (kích thước bộ nhớ cache); đừng đoán, đo! – Christoph