Nhìn vào mã này:Tại sao các trình biên dịch không tối ưu hóa điều này?
struct Data {
};
struct Init {
Data *m_data;
Init() : m_data(new Data) { }
~Init() {
delete m_data;
}
};
class Object {
private:
const int m_initType;
Data *m_data;
public:
Object(const Init &init) : m_initType(0), m_data(init.m_data) { }
Object(Init &&init) : m_initType(1), m_data(init.m_data) { init.m_data = nullptr; }
~Object() {
if (m_initType==1) {
delete m_data;
}
}
};
void somefunction(const Object &object); // it is intentionally not defined
void callInitA() {
Init x;
somefunction(x);
}
void callInitB() {
somefunction(Init());
}
Như Object::m_initType
là const, nó không thay đổi sau khi xây dựng. Vì vậy, theo lý thuyết, trong callInitA
và trong callInitB
, trình biên dịch biết giá trị của m_initType
khi nó inline ~Object()
. Tuy nhiên, cả gcc và clang fails to apply tối ưu hóa này và cả hai đều kiểm tra giá trị của m_initType
.
Tại sao lại như vậy? Có một số quy tắc ngôn ngữ chống lại việc tối ưu hóa này hay các trình biên dịch không làm loại tối ưu hóa này?
(Câu hỏi này liên quan chặt chẽ đến this, nhưng nó là một câu hỏi cụ thể hơn, tôi hy vọng tôi có thể nhận được một câu trả lời cho việc này)
'Init g; void somefunction (Object object) {object. ~ Object(); đối tượng mới (& đối tượng) (g);} 'có thể? –
Dưới đây là một ví dụ nhỏ hơn nhiều mà tôi nghĩ rằng chứng minh cùng một vấn đề: https://godbolt.org/g/zTyctM - nếu bạn nhận xét 'somefunction' thì toàn bộ điều được tối ưu hóa, nhưng với' somefunction' được gọi là trình biên dịch tạo ra một kiểm tra cho một cái gì đó mà "không thể xảy ra." –
MSVC++ áp dụng tối ưu hóa này. Một số có, một số thì không, các trình tối ưu hóa không được tạo ra như nhau. –