Trong C++, tôi đang cố gắng viết một trình bao bọc xung quanh một số nguyên 64 bit. Kỳ vọng của tôi là nếu được viết chính xác và tất cả các phương thức được gạch chân như vậy thì trình bao bọc phải là biểu diễn như kiểu thực. Câu trả lời cho điều này question trên SO dường như đồng ý với kỳ vọng của tôi.Tại sao VC++ không thể tối ưu hóa một trình bao bọc số nguyên?
tôi đã viết mã này để kiểm tra sự mong đợi của tôi:
class B
{
private:
uint64_t _v;
public:
inline B() {};
inline B(uint64_t v) : _v(v) {};
inline B& operator=(B rhs) { _v = rhs._v; return *this; };
inline B& operator+=(B rhs) { _v += rhs._v; return *this; };
inline operator uint64_t() const { return _v; };
};
int main(int argc, char* argv[])
{
typedef uint64_t;
//typedef B T;
const unsigned int x = 100000000;
Utils::CTimer timer;
timer.start();
T sum = 0;
for (unsigned int i = 0; i < 100; ++i)
{
for (uint64_t f = 0; f < x; ++f)
{
sum += f;
}
}
float time = timer.GetSeconds();
cout << sum << endl
<< time << " seconds" << endl;
return 0;
}
Khi tôi chạy này với typedef B T
; thay vì typedef uint64_t T
thời gian báo cáo luôn chậm hơn 10% khi được biên dịch với VC++. Với g ++ các màn trình diễn giống nhau nếu tôi sử dụng trình bao bọc hay không.
Vì g ++ hiện nó tôi đoán không có lý do kỹ thuật tại sao VC++ không thể tối ưu hóa chính xác điều này. Có điều gì tôi có thể làm để làm cho nó tối ưu hóa nó?
Tôi đã cố gắng để chơi với optimisations cờ không thành công
Bạn có chạy mã từ Visual Studio hoặc từ một bảng điều khiển Windows không? – jpo38
Tôi sẽ không ngạc nhiên nếu g ++ gấp toàn bộ vòng lặp. –
Lặn vào lắp ráp được tạo ra! –