형변환에는 어느 정도의 비용이 소비되나요?

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

형변환에는 어느 정도의 비용이 소비되나요?

Post by 비회원 »

암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?

답변 부탁드립니다.
mastercho
Posts: 587
Joined: 2004-05-09 20:37

Post by mastercho »

아마도 컴파일러가 컴파일 시킬때, 강제로 형변환을 하나 안하나,
똑 같은 어셈을 뽑아 낼 겁니다
비회원

Post by 비회원 »

dynamic_cast를 제외한 나머지는 같다고 생각하시면 됩니다. 암묵적이라고 말하시는걸 보면 dynamic_cast까지 생각하고 계신건 아니겠지만 말입니다.
verena
Posts: 136
Joined: 2003-09-04 16:36

Re: 형변환에는 어느 정도의 비용이 소비되나요?

Post by verena »

비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?

답변 부탁드립니다.
통상적으로 타입 캐스팅을 명시적으로 해주지 않아 암묵적인 형변환이 일어나는 경우엔 temporary objects라는 기법이 발생하게 됩니다.

불필요한 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: 형변환에는 어느 정도의 비용이 소비되나요?

Post by 류광 »

verena wrote:
비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?

답변 부탁드립니다.
통상적으로 타입 캐스팅을 명시적으로 해주지 않아 암묵적인 형변환이 일어나는 경우엔 temporary objects라는 기법이 발생하게 됩니다.

불필요한 temporary objects가 생성되면 메모리나 레지스터를 낭비하게 되는 결과가 있긴 하겠지만, 현실적으로 c++에선 이 "임시객체"라 불리는 기법을 다방면에서 사용합니다.

자세한 내용은 temporary ojbects문구로 c++문서를 참조하시거나, effective c++책을 참조하시기 바랍니다.

첨언하자면 암묵적인 형변환은 c-style, static, dynamic캐스팅등을 하지 않아 생기게 되는 형변환을 말합니다. 물론 컴파일이 제대로 통과한 경우에만이겠죠. 해당 변수의 타입이 보통 user-defined type인 경우에 자주 발생하게 됩니다.

그래서 형변환으로 인한 warnning문구도 꼼꼼히 살펴보시는게 optimization에 큰 도움이 되실겁니다.

결론은 실제 형변환되어 값이 저장될 객체크기만큼의 메모리를 더 잡아 먹고, 속도상으론 이 임시객체가 메모리에 잡힐 시간과 이 임시객체에 원본객체의 값을 대입하는 시간과 이 임시객체의 값을 실제 대상 객체에 값을 대입하는 시간이 더 늘어나게 되겠습니다.

생각만큼 시원한 답변이 못되어 드리는것 같네요. 이상입니다...
암묵적 형변환과 임시 객체가 직접 연관되어 있나요? 제가 아는 것과는 좀 다르네요... 예를 들어 int i = 0; float f = i; 에서 임시 float 객체가 생성되지는 않는 걸로 알고 있습니다. 참조나 포인터 변환에서도 임시 객체는 생기지 않구요. 또 B b; D d = b;나 d = b; 역시 복사 생성자나 배정 연산자를 제대로 만들어 두었다면 임시 객체는 생기지 않구요. 반드시 임시 객체가 생겨야 하는 것은 operator T() 정도인 것 같습니다만 이 경우도 임시 객체는 반환값 전달 방식에 더 큰 관련이 있겠구요. f(B) 형태에서도 임시 객체가 생기지만 역시 형변환 보다는 인자 전달 방식 때문이겠구요...
비회원

Post by 비회원 »

음.. 제 생각에도 좀 이상하네요

<dynamic_cast> 가 아닌 이상에야 컴파일시에 캐스팅이 가능할것 같습니다만.
doldori
Posts: 28
Joined: 2004-05-03 15:52

Post by doldori »

verena님은 클래스형에 초점을 맞춰 말씀하신 것 같습니다. 인자 하나로만 호출할 수 있는 생성자를
형변환 함수로도 볼 수 있겠습니다. 그렇다면 이 과정에 임시 개체가 개입될 수 있습니다. 예를 들어

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)
}
(1)에서는 int로부터 double로 암시적 형변환이 발생합니다.
(2)의 코드는 int로부터 S로의 암시적 형변환으로 볼 수 있습니다. (1)과 비교하여 다를 것이 없지요.
이때 (2)에서 S(int) 생성자에 의해 임시 S 개체가 만들어지고, 이 임시 개체가 대입연산자의 인자가 됩니다.
double과 같은 내장형에서는 임시 개체가 만들어지지 않는 것으로 압니다만(확실히는 모릅니다.), 어떤
형식으로든 형변환에 필요한 런타임 인스트럭션은 필요할 것입니다.
OP께서는 이러한 런타임 오버헤드가 얼마나 될 것인가에 관심이 있으신 것 같은데, 그것은 한 마디로
말하기 힘듭니다. 플랫폼, 컴파일러, 최적화 등 여러 조건에 따라 달라지니까요.
verena
Posts: 136
Joined: 2003-09-04 16:36

Re: 형변환에는 어느 정도의 비용이 소비되나요?

Post by verena »

류광 wrote:암묵적 형변환과 임시 객체가 직접 연관되어 있나요? 제가 아는 것과는 좀 다르네요... 예를 들어 int i = 0; float f = i; 에서 임시 float 객체가 생성되지는 않는 걸로 알고 있습니다. 참조나 포인터 변환에서도 임시 객체는 생기지 않구요. 또 B b; D d = b;나 d = b; 역시 복사 생성자나 배정 연산자를 제대로 만들어 두었다면 임시 객체는 생기지 않구요. 반드시 임시 객체가 생겨야 하는 것은 operator T() 정도인 것 같습니다만 이 경우도 임시 객체는 반환값 전달 방식에 더 큰 관련이 있겠구요. f(B) 형태에서도 임시 객체가 생기지만 역시 형변환 보다는 인자 전달 방식 때문이겠구요...
네 말씀하신되로 위의 경우에는 임시 객체가 발생하진 않습니다.

주로 함수호출시 파라미터로 넘기거나, 함수리턴시에 암묵적인 형변환에 의해 임시 객체가 생성됩니다.

아 그리고 위의 경우는 제가 예를들지 않았는데, 의미 전달이 명확하지 않았나 봅니다. ㅜㅜ

아. 윗분께서 자세히 설명해 주셨네요. 네 맞습니다. ^^.. ㅜㅜ
Holic for Template +_+
비회원

형변환에 대한 애기만이라면..

Post by 비회원 »

암묵적이던 명시적이던 임시객체의 생성과는 연관이 없어 보입니다.

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: 형변환에는 어느 정도의 비용이 소비되나요?

Post by 전외솔 »

비회원 wrote:암묵적인 형변환을 하는 것은 메모리나 속도상의 어떤 불이익이 있는가요?

답변 부탁드립니다.
암묵적인 형변환은 컴파일시에 모두 명시적인 형변환으로 바뀌어서 컴파일됩니다.

즉, 형변환이 암묵적인가 명시적인가는 아무런 차이가 없습니다.

'메모리나 속도상의 어떤 불이익'은 그것이 어떤 종류의 형변환인가에 의존합니다.
Locked