때때로 문자열의 길이를 상수와 비교해야 할 때가 있습니다. 예를 들어
:컴파일 타임 "strlen()"이 효과적입니까?
if (line.length() > 2)
{
// Do something...
}
하지만 코드에서 "마술"상수를 사용하지 않도록 노력하고 있어요.
보통 나는 그런 코드를 사용 : 그것은 때문에 함수 호출의 더 읽기,하지만 효율적입니다
if (line.length() > strlen("[]"))
{
// Do something...
}
. 꽤 좋은 코드 생성 릴리스 빌드에서
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...
}
(2008 년으로 VisualStudio) :
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
을 그리고 좋은 일이 컴파일러가 포함되지 않는다는 것입니다
나는 다음과 같이 템플릿 함수를 썼다 "[]"바이너리 출력 문자열.
컴파일러 관련 최적화입니까, 아니면 일반적인 동작입니까?
아마 모든 배열 유형에 대해 하나의 템플리트를 사용할 수 있지만, 다음과 같은 것이 있습니다 :'template size_t _lenof (const T (&) [N]) {return N - 1; }', 당신의 예제와 똑같이 작동해야합니다. –
@ Envan Teran : 좋은 생각이지만,이 함수는 '\ 0'을 종료하기 때문에 문자열 (char/wchar_t의 배열)에 대해서만 의미가 있습니다. 함수는 int [10]에서 작동하고 9를 반환합니다. 나는 그것이 의미가 있다고 생각하지 않습니다;) – Dmitriy
@Dmitriy : 실제로 –