2017-10-22 11 views
45

Giả sử tôi có một loại POD như thế này:Các byte đệm của loại POD có được sao chép không?

struct A { 
    char a; 
    int b; 
}; 

Trên hệ thống của tôi, sizeof(A) == 8, mặc dù sizeof(char) == 1sizeof(b) == 4. Điều này có nghĩa là cấu trúc dữ liệu có 3 byte không sử dụng.

Bây giờ giả sử chúng ta làm

A x = ...; 
A y =x; 

Câu hỏi:

Có đảm bảo rằng tất cả 8 byte của xy sẽ giống hệt nhau, ngay cả những người không sử dụng 3?

Tương tự, nếu tôi chuyển byte cơ bản của một số đối tượng khác không hiểu ý nghĩa hoặc cấu trúc của chúng và xử lý chúng thành một mảng 8 byte, chương trình kia có thể so sánh an toàn hai số A s để bình đẳng không?

Lưu ý: In an experiment with gcc 7, có vẻ như những byte đó được sao chép. Tôi muốn biết nếu điều này được đảm bảo.

+0

liên quan: https: // stackoverflow.com/a/1575369/955273 –

+1

Tôi không nghĩ rằng câu trả lời của câu hỏi "là các byte đệm giống nhau". Nó chỉ nói rằng memcpy sao chép chúng, nhưng đó không phải là chính xác những gì OP hỏi. – vsoftco

+5

@vsoftco * "' = 'chỉ được yêu cầu để sao chép các thành viên. Có thể hoặc không sao chép phần đệm." * Đoạn thứ hai trong câu trả lời trên cùng. –

Trả lời

40

Trình tạo bản sao/di chuyển được xác định rõ ràng cho một lớp phi công đoàn X thực hiện sao chép/di chuyển của các cơ sở và thành viên của nó.

12,8/15 [class.copy] trong N4141

Các mẫu bit trong byte đệm được như vậy, phép khác nhau.

+0

Thật không may là N4141 được [bảo vệ bằng mật khẩu] (https://stackoverflow.com/questions/27180058/which-c-draft). Dường như nó là tiêu chuẩn cuối cùng cho C++ 14. Bản nháp là [N4140] (https://github.com/cplusplus/draft/blob/master/papers/n4140.pdf), thông tin là [từ chuỗi Reddit này] (https: //www.reddit. com/r/cpp/comments/2sewtw/c14_published_by_iso_today /). Tôi không thể nói rằng tôi tin tưởng rằng chủ đề reddit 100%. Trong đó, nó là 12,8/16, không 15. Có bất cứ nơi nào một đồ thị được chỉ dẫn, nơi các tiêu chuẩn và bản nháp là các nút và một cạnh có nghĩa là _ là một phần của_? –

+3

@StefanHanke Trên thực tế, nguồn của N4141 có sẵn trên github, bạn chỉ cần tự mình xây dựng nó. https://github.com/cplusplus/draft/tree/n4141 –

+4

"Trên thực tế, nguồn của N4141 có sẵn trên github, bạn chỉ cần tự mình xây dựng" Đó là điều rất C++ để nói. – pmf

8

Nó không có thẩm quyền, nhưng entry cppreference 's cho std::memcmp gợi ý rằng các byte đệm có thể khác nhau:

memcmp() giữa hai đối tượng thuộc loại struct{char c; int n;} sẽ so sánh các byte đệm có giá trị có thể khác nhau khi các giá trị của cn đều giống nhau

+9

Bạn không chắc chắn điều này liên quan đến việc sao chép? – imallett

4

Trả lời câu hỏi thứ hai của bạn:

Tương tự, nếu tôi chuyển các byte bên dưới của một số đối tượng sang chương trình khác không hiểu ý nghĩa hay cấu trúc của chúng và xử lý chúng như một mảng 8 byte, chương trình kia có thể so sánh an toàn với hai đối với bình đẳng không?

Như một đối tượng kiểu bạn có thể chứa byte đệm, một chương trình khác thường không thể so sánh hai đối tượng như vậy cho bình đẳng:

Biết được bit của các byte mà làm ra các đối tượng ngữ nghĩa là chìa khóa để xác định biểu thị giá trị của nó. Tuy nhiên, trong trường hợp này, chương trình đích chỉ biết biểu diễn đối tượng , tức là chuỗi byte đại diện cho một đối tượng như vậy trong bộ nhớ, bao gồm byte đệm.Một hàm như memcmp chỉ có thể so sánh các đối tượng có biểu diễn giá trị giống hệt với biểu diễn đối tượng của nó theo một cách có ý nghĩa. Nếu bạn sử dụng nó để so sánh các đối tượng có giá trị khôn ngoan mặc dù chúng có đệm, nó có thể không đưa ra kết quả đúng vì nó không thể biết bit nào trong biểu diễn đối tượng không liên quan đến đại diện giá trị của hai đối tượng bằng nhau.

Xem http://en.cppreference.com/w/cpp/language/object

6

cho rằng bạn được hỏi về một loại POD (do đó bao gồm các đoàn thể) đó là đáng nói đến là theo [class.copy]

Các ngầm định nghĩa sao chép/di chuyển constructor cho một đoàn X sao chép đối tượng đại diện (6,9) của X

rằng cho ty trivially copyable pes nên bao gồm bit padding là tốt. Vì vậy, nó có thể chỉ là vấn đề thay thế A với

union A{ struct { 
    char a; 
    int b; 
}; }; 

(trên thực tế, các sử dụng trên một tổ chức phi tiêu chuẩn struct nặc danh, nhưng bạn sẽ có được điểm ...)

+0

Liên kết có liên quan: https://stackoverflow.com/questions/26241397/difference-between-object-and-value-representation-by-example – MSalters

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