Đôi khi cần phải so sánh độ dài của chuỗi với hằng số.
Ví dụ:Biên dịch "strlen()" có hiệu quả không?
if (line.length() > 2)
{
// Do something...
}
Nhưng tôi đang cố gắng để tránh sử dụng "kỳ diệu" hằng số trong mã.
Thông thường tôi sử dụng mã ví dụ:
if (line.length() > strlen("[]"))
{
// Do something...
}
Nó là dễ đọc hơn, nhưng không hiệu quả vì các lời gọi hàm.
tôi đã viết chức năng mẫu như sau:
template<size_t N>
size_t _lenof(const char (&)[N])
{
return N - 1;
}
template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
return N - 1;
}
// Using:
if (line.length() > _lenof("[]"))
{
// Do something...
}
Trong một thông cáo xây dựng (VisualStudio 2008) nó tạo mã khá tốt:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
Và điều đáng mừng là trình biên dịch không bao gồm "[]" chuỗi trong đầu ra nhị phân.
Đây có phải là một tối ưu hóa trình biên dịch cụ thể hay là một hành vi phổ biến?
bạn có thể sử dụng một mẫu cho tất cả các loại mảng, một cái gì đó nói dối: 'template size_t _lenof (const T (&) [N]) {return N - 1; } ', vẫn hoạt động giống như ví dụ của bạn. –
@Evan Teran: ý tưởng hay, nhưng các hàm này chỉ có ý nghĩa đối với các chuỗi (mảng char/wchar_t) vì chấm dứt '\ 0'. Chức năng của bạn sẽ làm việc cho int [10] và trả về 9 - Tôi không nghĩ rằng nó có ý nghĩa;) – Dmitriy
@Dmitriy: thực sự –