암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?
답변 부탁드립니다.
형변환에는 어느 정도의 비용이 소비되나요?
Moderator: 류광
-
- Posts: 136
- Joined: 2003-09-04 16:36
Re: 형변환에는 어느 정도의 비용이 소비되나요?
통상적으로 타입 캐스팅을 명시적으로 해주지 않아 암묵적인 형변환이 일어나는 경우엔 temporary objects라는 기법이 발생하게 됩니다.비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?
답변 부탁드립니다.
불필요한 temporary objects가 생성되면 메모리나 레지스터를 낭비하게 되는 결과가 있긴 하겠지만, 현실적으로 c++에선 이 "임시객체"라 불리는 기법을 다방면에서 사용합니다.
자세한 내용은 temporary ojbects문구로 c++문서를 참조하시거나, effective c++책을 참조하시기 바랍니다.
첨언하자면 암묵적인 형변환은 c-style, static, dynamic캐스팅등을 하지 않아 생기게 되는 형변환을 말합니다. 물론 컴파일이 제대로 통과한 경우에만이겠죠. 해당 변수의 타입이 보통 user-defined type인 경우에 자주 발생하게 됩니다.
그래서 형변환으로 인한 warnning문구도 꼼꼼히 살펴보시는게 optimization에 큰 도움이 되실겁니다.
결론은 실제 형변환되어 값이 저장될 객체크기만큼의 메모리를 더 잡아 먹고, 속도상으론 이 임시객체가 메모리에 잡힐 시간과 이 임시객체에 원본객체의 값을 대입하는 시간과 이 임시객체의 값을 실제 대상 객체에 값을 대입하는 시간이 더 늘어나게 되겠습니다.
생각만큼 시원한 답변이 못되어 드리는것 같네요. 이상입니다...
Holic for Template +_+
-
- Posts: 3805
- Joined: 2001-07-25 09:00
- Location: GPGstudy
- Contact:
Re: 형변환에는 어느 정도의 비용이 소비되나요?
암묵적 형변환과 임시 객체가 직접 연관되어 있나요? 제가 아는 것과는 좀 다르네요... 예를 들어 int i = 0; float f = i; 에서 임시 float 객체가 생성되지는 않는 걸로 알고 있습니다. 참조나 포인터 변환에서도 임시 객체는 생기지 않구요. 또 B b; D d = b;나 d = b; 역시 복사 생성자나 배정 연산자를 제대로 만들어 두었다면 임시 객체는 생기지 않구요. 반드시 임시 객체가 생겨야 하는 것은 operator T() 정도인 것 같습니다만 이 경우도 임시 객체는 반환값 전달 방식에 더 큰 관련이 있겠구요. f(B) 형태에서도 임시 객체가 생기지만 역시 형변환 보다는 인자 전달 방식 때문이겠구요...verena wrote:통상적으로 타입 캐스팅을 명시적으로 해주지 않아 암묵적인 형변환이 일어나는 경우엔 temporary objects라는 기법이 발생하게 됩니다.비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?
답변 부탁드립니다.
불필요한 temporary objects가 생성되면 메모리나 레지스터를 낭비하게 되는 결과가 있긴 하겠지만, 현실적으로 c++에선 이 "임시객체"라 불리는 기법을 다방면에서 사용합니다.
자세한 내용은 temporary ojbects문구로 c++문서를 참조하시거나, effective c++책을 참조하시기 바랍니다.
첨언하자면 암묵적인 형변환은 c-style, static, dynamic캐스팅등을 하지 않아 생기게 되는 형변환을 말합니다. 물론 컴파일이 제대로 통과한 경우에만이겠죠. 해당 변수의 타입이 보통 user-defined type인 경우에 자주 발생하게 됩니다.
그래서 형변환으로 인한 warnning문구도 꼼꼼히 살펴보시는게 optimization에 큰 도움이 되실겁니다.
결론은 실제 형변환되어 값이 저장될 객체크기만큼의 메모리를 더 잡아 먹고, 속도상으론 이 임시객체가 메모리에 잡힐 시간과 이 임시객체에 원본객체의 값을 대입하는 시간과 이 임시객체의 값을 실제 대상 객체에 값을 대입하는 시간이 더 늘어나게 되겠습니다.
생각만큼 시원한 답변이 못되어 드리는것 같네요. 이상입니다...
-
- Posts: 28
- Joined: 2004-05-03 15:52
verena님은 클래스형에 초점을 맞춰 말씀하신 것 같습니다. 인자 하나로만 호출할 수 있는 생성자를
형변환 함수로도 볼 수 있겠습니다. 그렇다면 이 과정에 임시 개체가 개입될 수 있습니다. 예를 들어
(1)에서는 int로부터 double로 암시적 형변환이 발생합니다.
(2)의 코드는 int로부터 S로의 암시적 형변환으로 볼 수 있습니다. (1)과 비교하여 다를 것이 없지요.
이때 (2)에서 S(int) 생성자에 의해 임시 S 개체가 만들어지고, 이 임시 개체가 대입연산자의 인자가 됩니다.
double과 같은 내장형에서는 임시 개체가 만들어지지 않는 것으로 압니다만(확실히는 모릅니다.), 어떤
형식으로든 형변환에 필요한 런타임 인스트럭션은 필요할 것입니다.
OP께서는 이러한 런타임 오버헤드가 얼마나 될 것인가에 관심이 있으신 것 같은데, 그것은 한 마디로
말하기 힘듭니다. 플랫폼, 컴파일러, 최적화 등 여러 조건에 따라 달라지니까요.
형변환 함수로도 볼 수 있겠습니다. 그렇다면 이 과정에 임시 개체가 개입될 수 있습니다. 예를 들어
Code: Select all
struct S
{
S(int);
S& operator=(const S&);
};
void f()
{
double d(0.0);
d = 1; // (1)
S s(0);
s = 1; // (2)
}
(2)의 코드는 int로부터 S로의 암시적 형변환으로 볼 수 있습니다. (1)과 비교하여 다를 것이 없지요.
이때 (2)에서 S(int) 생성자에 의해 임시 S 개체가 만들어지고, 이 임시 개체가 대입연산자의 인자가 됩니다.
double과 같은 내장형에서는 임시 개체가 만들어지지 않는 것으로 압니다만(확실히는 모릅니다.), 어떤
형식으로든 형변환에 필요한 런타임 인스트럭션은 필요할 것입니다.
OP께서는 이러한 런타임 오버헤드가 얼마나 될 것인가에 관심이 있으신 것 같은데, 그것은 한 마디로
말하기 힘듭니다. 플랫폼, 컴파일러, 최적화 등 여러 조건에 따라 달라지니까요.
-
- Posts: 136
- Joined: 2003-09-04 16:36
Re: 형변환에는 어느 정도의 비용이 소비되나요?
네 말씀하신되로 위의 경우에는 임시 객체가 발생하진 않습니다.류광 wrote:암묵적 형변환과 임시 객체가 직접 연관되어 있나요? 제가 아는 것과는 좀 다르네요... 예를 들어 int i = 0; float f = i; 에서 임시 float 객체가 생성되지는 않는 걸로 알고 있습니다. 참조나 포인터 변환에서도 임시 객체는 생기지 않구요. 또 B b; D d = b;나 d = b; 역시 복사 생성자나 배정 연산자를 제대로 만들어 두었다면 임시 객체는 생기지 않구요. 반드시 임시 객체가 생겨야 하는 것은 operator T() 정도인 것 같습니다만 이 경우도 임시 객체는 반환값 전달 방식에 더 큰 관련이 있겠구요. f(B) 형태에서도 임시 객체가 생기지만 역시 형변환 보다는 인자 전달 방식 때문이겠구요...
주로 함수호출시 파라미터로 넘기거나, 함수리턴시에 암묵적인 형변환에 의해 임시 객체가 생성됩니다.
아 그리고 위의 경우는 제가 예를들지 않았는데, 의미 전달이 명확하지 않았나 봅니다. ㅜㅜ
아. 윗분께서 자세히 설명해 주셨네요. 네 맞습니다. ^^.. ㅜㅜ
Holic for Template +_+
형변환에 대한 애기만이라면..
암묵적이던 명시적이던 임시객체의 생성과는 연관이 없어 보입니다.
위 코드를
로 한다고 임시객체가 생기지 않는건 아닐거구요.
질문하신분의 의도는 단순하게 명시적으로 캐스팅을 한경우와 암묵적으로 캐스팅을 한경우에
어떠한 불이익이 있는가 하는것인듯 합니다.
Code: Select all
struct S
{
S(int);
S& operator=(const S&);
};
void f()
{
double d(0.0);
d = 1; // (1)
S s(0);
s = 1; // (2)
}
Code: Select all
struct S
{
S(int);
S& operator=(const S&);
};
void f()
{
double d(0.0);
d = 1; // (1)
S s(0);
s = (S)1; // (2)
}
질문하신분의 의도는 단순하게 명시적으로 캐스팅을 한경우와 암묵적으로 캐스팅을 한경우에
어떠한 불이익이 있는가 하는것인듯 합니다.
-
- Posts: 518
- Joined: 2002-07-03 01:24
Re: 형변환에는 어느 정도의 비용이 소비되나요?
암묵적인 형변환은 컴파일시에 모두 명시적인 형변환으로 바뀌어서 컴파일됩니다.비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?
답변 부탁드립니다.
즉, 형변환이 암묵적인가 명시적인가는 아무런 차이가 없습니다.
'메모리나 속도상의 어떤 불이익'은 그것이 어떤 종류의 형변환인가에 의존합니다.