2017-07-26 18 views
15

Hai cấu trúc này có tương thích với bố cục không?Các cấu trúc của các biến có cùng kiểu bố trí tương thích với một cấu trúc có chứa một mảng của kiểu đó không?

struct One { 
    float x, y, z; 
}; 

struct Two { 
    float c[3]; 
}; 

Cả hai chứa 3 nổi, vì vậy trong một cách, mô tả này có thể được coi là đúng (từ N3797):

16 Hai tiêu chuẩn bố trí struct (khoản 9) các loại bố cục tương thích nếu họ có cùng số lượng thành viên dữ liệu không tĩnh và thành viên dữ liệu không tĩnh tương ứng (theo thứ tự khai báo) có loại tương thích bố cục (3.9).

N4659 có một văn bản khác nhau:

Trình tự ban đầu chung của hai tiêu chuẩn bố trí struct (khoản 12) loại là chuỗi dài nhất của các thành viên dữ liệu không tĩnh và ruộng bit- trong thứ tự khai báo, bắt đầu với thực thể đầu tiên trong mỗi các cấu trúc, sao cho các thực thể tương ứng có kiểu tương thích bố trí và cả hai thực thể đều không được biết hoặc cả hai đều là các số bit có cùng chiều rộng.

Hai loại cấu trúc bố cục tiêu chuẩn (Điều 12) là các lớp tương thích bố cục nếu trình tự ban đầu chung của chúng bao gồm tất cả các thành viên và trường của cả hai lớp (6.9).

Nếu câu trả lời là không, chúng không tương thích với bố cục, thì: đó có phải là ý định của ủy ban không? Có thể họ muốn OneTwo tương thích với bố cục (có thể thành viên ủy ban đọc thông tin này và có thể làm rõ).


Câu hỏi bổ sung: được đảm bảo rằng sizeof(One)==sizeof(Two)?

+3

Mỗi người có thể chứa 3 phao, nhưng cái đầu tiên có 3 thành viên và cái thứ hai chỉ có một thành viên. Điều đó nói rằng 'std :: complex' được phép làm điều này vì vậy tôi không chắc chắn – NathanOliver

+0

kích thước sẽ giống nhau –

+0

Suy nghĩ về ** alignment **. .. nếu nó lớn hơn 4 byte ** thì không có **. Nhưng bạn có thể ép buộc nó (theo cách không di động). As-là trình biên dịch miễn phí để làm những gì tốt nhất (theo mục tiêu tối ưu hóa và kiến ​​trúc của nó) –

Trả lời

10

Vâng, no:

[...] nếu họ có cùng một số dữ liệu không tĩnh thành viên [...]

One có ba thành viên: x, yz. Two có một thành viên: c. Chúng không có cùng số lượng thành viên dữ liệu không tĩnh, do đó chúng không tương thích với bố cục.


Từ ngữ mới khác nhưng bạn kết thúc ở cùng một vị trí. [basic.types] xác định bố trí tương thích như:

Hai loại CV1 T1 và T2 CV2 nhiều loại bố trí tương thích nếu T1 và T2 là cùng loại, kiểu liệt kê bố trí tương thích, hoặc các loại lớp học tiêu chuẩn bố trí bố trí tương thích.

[class.mem] định nghĩa các lớp học bố trí tương thích là:

Hai loại struct tiêu chuẩn bố trí các lớp học bố trí tương thích nếu chuỗi ban đầu chung của họ bao gồm tất cả các thành viên và bit lĩnh vực cả hai lớp ([cơ bản. loại]).

Trường hợp chuỗi ban đầu thường là:

Trình tự ban đầu chung của hai loại cấu trúc tiêu chuẩn bố trí là chuỗi dài nhất của các thành viên dữ liệu không tĩnh và bit lĩnh vực nhằm khai, bắt đầu với thực thể đầu tiên như vậy trong mỗi cấu trúc, sao cho các thực thể tương ứng có các kiểu tương thích bố cục và cả hai thực thể không phải là một trường bit hoặc cả hai đều là các trường bit có cùng độ rộng.

Ở đây, thành viên đầu tiên của One (float x) không phải là bố trí phù hợp với thành viên đầu tiên của Two (float c[3]), do đó trình tự ban đầu thông thường là sản phẩm nào.

+0

Nhưng từ ngữ mới sử dụng từ "thực thể", không phải là thành viên. Tôi có thể tương quan "thực thể" ở đây. x là c [0], y là c [1], z là c [2]. Tôi đang đi sai đường? – geza

+0

@geza http://eel.is/c++draft/basic#3.sentence-1 – Barry

+0

Tôi có thể coi 'c [0]' là một thực thể giá trị. Tại sao họ sử dụng thực thể từ ở đây? Họ có thể đã sử dụng thành viên, nhưng vì lý do nào đó, họ chọn thực thể. Tôi không nói rằng bạn sai, nó không đủ thuyết phục. Có lẽ văn bản có thể được thực hiện chính xác hơn. – geza

2

Trình biên dịch được phép thêm đệm giữa các thành viên trong một số class hoặc struct.

Các phần tử mảng nằm ở vị trí tiếp giáp.

Họ có thể không tương thích với bố cục tùy thuộc vào cách trình biên dịch tổ chức các thành viên trong struct.

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