Những gì tôi hiểu là điều này không nên được thực hiện, nhưng tôi tin rằng tôi đã nhìn thấy ví dụ mà làm điều gì đó như thế này (mã lưu ý là không nhất thiết phải đúng cú pháp nhưng ý tưởng là có)Có an toàn khi trả lại cấu trúc trong C hoặc C++ không?
typedef struct{
int a,b;
}mystruct;
Và sau đó đây là một chức năng
mystruct func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
return retval;
}
tôi hiểu rằng chúng ta nên luôn luôn trả về một con trỏ đến một cấu trúc malloc'ed nếu chúng tôi muốn làm một cái gì đó như thế này, nhưng tôi tích cực tôi đã nhìn thấy những ví dụ mà làm điều gì đó như thế này. Điều này có đúng không? Cá nhân tôi luôn luôn hoặc là trả về một con trỏ đến một cấu trúc malloc'ed hoặc chỉ cần làm một vượt qua bằng cách tham chiếu đến hàm và sửa đổi các giá trị ở đó. (Bởi vì sự hiểu biết của tôi là khi phạm vi chức năng kết thúc, bất kỳ chồng nào được sử dụng để phân bổ cấu trúc có thể được ghi đè).
Hãy thêm phần thứ hai vào câu hỏi: Điều này có khác nhau tùy theo trình biên dịch không? Nếu có, thì hành vi của các phiên bản trình biên dịch mới nhất cho máy tính để bàn là gì: gcc, g ++ và Visual Studio?
Suy nghĩ về vấn đề này?
"Những gì tôi hiểu là điều này không nên được thực hiện" nói ai? Tôi luôn làm việc đó. Cũng lưu ý rằng typedef không cần thiết trong C++ và không tồn tại những thứ như "C/C++". – PlasmaHH
Câu hỏi dường như ** không ** được nhắm mục tiêu tại C++. –
@PlasmaHH Sao chép các cấu trúc lớn xung quanh có thể không hiệu quả. Đó là lý do tại sao người ta phải cẩn thận và suy nghĩ kỹ trước khi trả về một cấu trúc theo giá trị, đặc biệt nếu cấu trúc có một hàm tạo bản sao đắt tiền và trình biên dịch không tốt với tối ưu hóa giá trị trả về. Gần đây tôi đã thực hiện tối ưu hóa cho một ứng dụng đã dành một phần đáng kể thời gian của mình trong các nhà xây dựng bản sao cho một vài cấu trúc lớn mà một lập trình viên đã quyết định quay lại theo giá trị ở mọi nơi. Sự thiếu hiệu quả đã khiến chúng tôi tốn khoảng 800.000 đô la trong phần cứng trung tâm dữ liệu bổ sung mà chúng tôi cần mua. – Crashworks