부스트의 lexical_cast은 비교적 빠릅니다.
편집 :
자세히 설명해 드리겠습니다. 다음은 그 사용의 예 : 더 복잡한 문자열 형식에 대한
std::string strSeconds = lexical_cast<std::string>(time.tv_sec);
std::string strMicroSec = lexical_cast<std::string>(time.tv_usec);
, 부스트 문서는 기본 std::stringstream
을 권장합니다. 예 :
std::stringstream ss;
ss << time.tv_sec << " seconds, " << (time.tv_usec/1000L) << " milliseconds";
return ss.str();
비교적 빠르고 읽기 쉽고 안전하며 표준입니다. cstdio 헤더의 sprintf
을 사용하면 속도를 조금 더 높일 수 있습니다. printf와의 long
변수에 대한 명시 적 지원이 없다 (사용 가능한 경우 바람직 sprintf_s),하지만 당신이 그들을 처리 할 %d
지정자를 사용할 수 있도록 32 비트 + 기계에 요즘 그들은 일반적으로 같은 크기 위치 :
std::string tvtostr(timeval time) {
// unless corrupted, the number of microseconds is always less than 1 second
assert(time.tv_sec >= 0 && time.tv_usec >= 0 && time.tv_usec < 1000000000L);
static_assert(sizeof(long)==4 && sizeof(int)==sizeof(long),
"assuming 32 bit ints and longs");
// space for one unbounded positive long, one long from 0 to 999,
// the string literal below, and a '\0' string terminator
boost::array<CHAR, 10+3+23+1> buffer;
sprintf_s(buffer.data(), buffer.size(), "%d seconds, %d milliseconds",
time.tv_sec, (time.tv_usec/1000L));
return buffer.data();
}
실제 문제는 무엇입니까? timeval 구조체는 이미 두 값을 분리합니다. sprintf() 또는 이와 유사한 함수를 사용하여 문자열을 그대로 문자열에 할당하면됩니다. –
@Remy 작동을 기대했지만, long int와 string 사이의 변환에 실패합니다. 왜 그런가요? – BSchlinker
Perl과 같은 언어와 달리 C++에는 유사하지 않은 데이터 유형 간의 기본 제공 변환이 없으므로 최악의 경우 라이브러리 (선호)를 사용하거나 자신의 라이브러리를 사용해야합니다. @Remy는 일반적으로 안전을 위해 snprintf를 선호합니다. 프로파일 링이'snprintf' 메소드의 측정 가능한 이점을 나타내지 않는 한'stringstream'을 제안합니다. –