dev.log2009. 7. 3. 17:17
행렬 클래스를 다음과 같이 구현해보려고 했었다.
struct matrix
{
    vector4 m[4];
    matrix( scalar m11, scalar m21, scalar m31, scalar m41,
               scalar m12, scalar m22, scalar m32, scalar m42,
               scalar m13, scalar m23, scalar m33, scalar m43,
               scalar m14, scalar m24, scalar m34, scalar m44 )
        : m[0]( m11, m21, m31, m41 ),
          m[1]( m12, m22, m32, m42 ),
          m[2]( m13, m23, m33, m43 ),
          m[3]( m14, m24, m34, m44 )
    {
    }
};

결론적으로 말하자면, 위와 같은 구문은 허용되지 않는다. 저런 식으로 접근해 보려고 1시간쯤 삽질했는데, 결과적으로는 안되는 거였다. 잠깐 생각해 보니 알 수 있었는데, 배열의 초기화는 {}로 묶인 배열의 초기화 목록으로만 가능하기 때문이다. 저런 구문이 작동 가능하려면 전역 배열도 다음과 같이 초기화할 수 있어야 한다.
[header]
extern int array[4];

[source]
int array[0](0);
int array[1](1);
int array[2](2);
int array[3](3);
배열의 이름/크기 선언과 별도로 배열의 내용물을 각기 따로 초기화할 수 있는 방법이 있다면 위의 구문이나 아래의 구문이나 내용면에서는 차이가 없는데, 아래와 같은 선언이 당연히 안될 거라는 것에 생각이 미치자 위의 것도 당연히 안된다는 걸 깨달았다. 기본 생성자에서 아무것도 안하게 하면 생성자 바디에서 초기화해도 오버헤드는 없으므로 상관은 없지만, 그래도 초기화는 초기화 리스트에서 해주는 것을 선호하는 지라, 약간 불만.

그리고 또 하나의 삽질은, 행렬의 SSE구현에서 다음과 같은 생성자를 만들려고 한 것이었다.
struct matrix
{
    matrix( __m128 v1, __m128 v2, __m128 v3, __m128 v4 )
    {
        //............
    }
};
__m128 구조체는 VC에서 선언한 SSE 내장함수용 16바이트 정렬 구조체인데, 위 생성자를 컴파일하면 2719 에러가 난다.
http://msdn.microsoft.com/ko-kr/library/373ak2y1.aspx
그냥 안되는 거였슴. 줵.

Posted by uhm