kiểm tra: vs 2008, chế độ gỡ lỗiTại sao một hàm tạo bằng văn bản người dùng ảnh hưởng đến assembly được tạo ra? môi trường
mã kiểm tra là:
// a demo for return value
class C
{
public:
int value;
int value2;
int value3;
//C(int v=0): value(v) {};
};
C getC(int v)
{
C c1;
return c1;
}
int main()
{
C c1 = getC(10);
return 0;
}
và đầu ra asm là:
; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR $T2595[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
mov ecx, DWORD PTR [eax]
mov DWORD PTR $T2594[ebp], ecx
mov edx, DWORD PTR [eax+4]
mov DWORD PTR $T2594[ebp+4], edx
mov eax, DWORD PTR [eax+8]
mov DWORD PTR $T2594[ebp+8], eax
mov ecx, DWORD PTR $T2594[ebp]
mov DWORD PTR _c1$[ebp], ecx
mov edx, DWORD PTR $T2594[ebp+4]
mov DWORD PTR _c1$[ebp+4], edx
mov eax, DWORD PTR $T2594[ebp+8]
mov DWORD PTR _c1$[ebp+8], eax
Từ đầu ra asm, chúng ta có thể thấy các biên dịch tạo ra 2 đối tượng tạm thời.
Tuy nhiên, khi tôi xác định các nhà xây dựng như sau:
C(int v=0): value(v) {};
và biên dịch lại chương trình, đầu ra asm được trở thành:
; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR _c1$[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
Rõ ràng, trình biên dịch tối ưu hóa mã, và câu hỏi của tôi là:
Tại sao việc thêm hàm tạo bằng văn bản do người dùng tạo ảnh hưởng đến assembly được tạo ra quá nhiều?
Trình biên dịch VC++ không thực hiện liên tục [Sao chép Elision] (http://en.wikipedia.org/wiki/Copy_elision). Bạn có thể thấy một ví dụ về điều đó. –
Tôi đã chỉnh sửa để sử dụng cụm từ * user-writing * thay vì * explicit *, vì sau này hơi khó hiểu vì có từ khoá 'explicit' cho các hàm tạo (và đây không phải là) –
Tôi thường không đề xuất để đọc quá nhiều vào mã assembly được tạo khi sử dụng Debug. Khi xây dựng Debug được sử dụng, trình biên dịch đảm bảo nó có thể thực hiện gỡ lỗi từng bước; điều này, đến lượt nó, có nghĩa là tối ưu hóa không phải lúc nào cũng được sử dụng. Nếu bạn muốn xem xét các hội đồng được tạo ra, tốt nhất làm như vậy trong xây dựng phát hành. – MicroVirus