2015-06-14 11 views
6

xem xét cấu trúc sau:Đang đọc thành viên công đoàn không hoạt động cùng loại với một người đang hoạt động được xác định rõ?

struct vec4 
{ 
    union{float x; float r; float s}; 
    union{float y; float g; float t}; 
    union{float z; float b; float p}; 
    union{float w; float a; float q}; 
}; 

Something như thế này dường như được sử dụng trong ví dụ GLM để cung cấp các loại GLSL giống như vec4, vec2 vv ..

Nhưng mặc dù việc sử dụng dự kiến ​​cũng giống như để làm cho có thể

vec4 a(1,2,4,7); 
a.x=7; 
a.b=a.r; 

này, nó có vẻ là một hành vi không xác định, bởi vì, như trích dẫn here ,

Trong liên minh, tối đa một trong các thành viên dữ liệu có thể hoạt động bất kỳ lúc nào, nghĩa là giá trị tối đa một trong các thành viên dữ liệu có thể được lưu trữ trong liên minh bất kỳ lúc nào.

Sẽ không tốt hơn nếu ví dụ: sử dụng chỉ cần xác định cấu trúc một cái gì đó như sau?

struct vec4 
{ 
    float x,y,z,w; 
    float &r,&g,&b,&a; 
    float &s,&t,&p,&q; 
    vec4(float X,float Y,float Z,float W) 
     :x(X),y(Y),z(Z),w(W), 
     r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4() 
     :r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4(const vec4& rhs) 
     :x(rhs.x),y(rhs.y),z(rhs.z),w(rhs.w), 
     r(x),g(y),b(z),a(w), 
     s(x),t(y),p(z),q(w) 
    {} 
    vec4& operator=(const vec4& rhs) 
    { 
     x=rhs.x; 
     y=rhs.y; 
     z=rhs.z; 
     w=rhs.w; 
     return *this; 
    } 
}; 

Hoặc tôi đang làm việc xung quanh vấn đề không tồn tại? Có lẽ một số tuyên bố đặc biệt cho phép truy cập vào các thành viên công đoàn không được đánh máy giống hệt nhau không?

+0

[Liên quan] (http://stackoverflow.com/questions/6512710/union-of-same-type-in-c) –

Trả lời

-1

Tôi nghĩ rằng báo giá mà bạn đang đề cập đến là hướng đến việc có các loại khác nhau trong công đoàn.

struct foo { 
    union { 
    float x, 
    int y, 
    double z, 
    }; 
}; 

Đây là những dữ liệu khác nhau, được lưu trữ thuận tiện vào cùng một cấu trúc, các công đoàn không được coi là cơ chế đúc.

Cách tiếp cận GLM sử dụng cùng một dữ liệu và sử dụng liên kết cho cơ chế bí danh.

Cách tiếp cận của bạn có thể là 'tốt hơn' C++ nhưng 'Kỹ thuật' tồi tệ hơn. Vector toán học cần phải nhanh chóng, và càng nhỏ càng tốt trong trường hợp này.

Triển khai của bạn làm cho véc tơ lớn gấp 3 lần. sizeof(glm::vec4); // 16 trong khi sizeof(your_vec4); // 48 - ouch Nếu bạn xử lý một số lượng lớn trong số này thường xảy ra, gấp 3 lần bộ nhớ cache bị thiếu với your_vec4.

Tôi nghĩ rằng bạn là đúng mặc dù sử dụng công đoàn của glm như bí danh là một chút nhiều, trong khi tôi không chắc chắn nếu không xác định của nó, nhưng loại điều tôi đã nhìn thấy rất nhiều mà không có nhiều vấn đề, và glm là rộng rãi đã sử dụng.

Tôi không thực sự thấy cần phải mô phỏng glsl trong C++ và struct { float x,y,z,w; } sẽ tốt hơn (ít nhất là trong tâm trí của tôi).

Các vấn đề liên quan