throw()
được thêm vào C++ 03 làm trình chỉ định ngoại lệ, tuy nhiên nó không được dùng trong C++ 11 cho thông số noexcept
.Tại sao không ném() và không chấp nhận có bất kỳ chi phí nào?
Sau khi lược tả một số mã để tìm tốc độ sử dụng throw()
, noexcept
và chỉ các hàm thuần túy tôi thấy rằng tất cả chúng đều có cùng thời gian cho lệnh gọi hàm.
Kết quả:
throw() noexcept plain old function
11233 ms 11105 ms 11216 ms
11195 ms 11122 ms 11150 ms
11192 ms 11151 ms 11231 ms
11214 ms 11218 ms 11228 ms
compiled with MinGW using g++ -o test.exe inc.cpp no.cpp -std=c++11 -O3
Đây là mã tôi đã sử dụng để cấu hình:
int main() {
unsigned long long iter = (unsigned long long)1 << (unsigned long long)40;
auto t1 = std::chrono::high_resolution_clock::now();
for(unsigned long long i = 0; i < iter; i++)
{
#ifdef THROW
throw_func();
#elif defined NOEXCEPT
noexcept_func();
#else
std_func();
#endif
}
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << " ms" << std::endl;
}
Các chức năng được định nghĩa là:
unsigned long long val = 1;
struct exception { };
void throw_func(void) throw()
{
if (!val++)
throw exception();
}
void noexcept_func(void) noexcept
{
if (!val++)
throw exception();
}
void std_func(void)
{
if (!val++)
throw exception();
}
Tôi đã rất ngạc nhiên bởi những kết quả này bởi vì tôi theo ấn tượng rằng throw()
và noexcept
đã thêm một số phí vào không còn tồn tại ion.
Tại sao không throw()
và noexcept
thêm bất kỳ phí nào vào cuộc gọi hàm so với cuộc gọi chức năng thông thường?
Câu lệnh đúng sẽ gần hơn với 'throw()' và chủ yếu là 'noexcept' không loại bỏ nhiều chi phí trong trường hợp chung. Trong khi trình biên dịch có vẻ như nó có thể tránh xử lý ngoại lệ cho hàm đó, thực tế là nó phải gọi chấm dứt nếu một ngoại lệ được ném có nghĩa là nó không thể thực sự. –
@ DavidRodríguez-dribeas Vì vậy, trường hợp 'noexcept' vẫn đang thực hiện kiểm tra ngoại lệ đầy đủ để ngăn chặn các ngoại lệ thoát khỏi chức năng? – phantom
@ DavidRodríguez-dribeas Đối với 'noexcept', không cần phải thư giãn ngăn xếp giúp. –