Nếu tôi đã điều sau đây: -Đi qua một cấu trúc để một hàm trong C
struct foo
{
int a;
int *b;
} bar;
void baz(struct foo qux)
{
}
Tôi có ngay trong suy nghĩ rằng đi qua bar
-baz()
kết quả trong một bản sao cục bộ của bar
bị đẩy vào stack? Nếu vậy, loại bản sao này là gì? trong C++, tôi giả định nó sẽ gọi hàm tạo bản sao, hoặc hàm tạo bản sao mặc định nhưng tôi không thực sự biết cách này sẽ hoạt động như thế nào trong C.
C có bất kỳ khái niệm nào của một hàm tạo bản sao mặc định không Tên? Có thể làm gì đó để thực hiện một bản sao sâu? (giả thuyết). Cách duy nhất tôi có thể nghĩ là thực sự làm một bản sao sâu và sau đó chuyển nó vào chức năng.
Thông thường, tôi sẽ chuyển con trỏ đến số foo
nhưng tôi chỉ tò mò về cách hoạt động của con trỏ. Hơn nữa tôi theo ấn tượng rằng việc truyền con trỏ nhanh hơn, tiết kiệm bộ nhớ và là quá trình hành động được khuyến nghị thực hiện khi thực hiện loại thao tác này. Tôi đoán đó là một bản sao nông; điều này có thể thay đổi không?
p.s. không có hàm khởi tạo nào trong C; chỉ trong C++. Trong C, cấu trúc dữ liệu của bạn sẽ chỉ được sao chép byte-cho-byte. –
@EdwardFalk: tất nhiên, trong thực tế tôi đã nói về * khởi tạo *, không phải xây dựng; Ngoài ra, điều "byte-cho-byte" không được chỉ định bởi tiêu chuẩn, mà thực sự chỉ nói rằng các trường được đặt tên được đảm bảo được sao chép ("Các thành viên chưa được đặt tên của các đối tượng cấu trúc có giá trị không xác định ngay cả sau khi khởi tạo.", C99 §6.7 .8 ¶9) - nghĩa là đệm có thể hoặc không được sao chép. –
Giải thích tuyệt vời, tôi đoán bạn không thể ghi đè lên hành vi mặc định để thực hiện một bản sao sâu nếu điều đó là bắt buộc? – chrisw