2012-02-02 14 views
10

Các đối tượng tạm thời IMO được lưu trữ trong bộ nhớ động (heap), nhưng tôi không chắc chắn. Bạn có thể vui lòng xác nhận hoặc phủ nhận suy nghĩ của tôi không?Đối tượng tạm thời được lưu trữ ở đâu?

+0

"IMO"? Tại sao lại là ý kiến ​​của bạn? Điều gì khiến bạn cho rằng điều đó? –

Trả lời

4

Điều này phụ thuộc rất nhiều vào việc triển khai thực hiện, nhưng chúng có thể nằm trong bộ nhớ tự động.

Lưu ý rằng phạm vi có thể phản trực giác, vì tối ưu hóa.

Sau đây:

class A 
{ 
//... 
}; 

//.... 

A foo() 
{ 
    A a; 
    return a; 
} 

Ở đây, các đối tượng a không nhất thiết phải cư trú chỉ trong phạm vi của chức năng, nhưng RVO có thể xảy ra.

Ngoài ra, khi truyền theo giá trị một đối tượng tạm thời, nó có thể không bị hủy ngay lập tức.

void foo(A a); 
//... 

foo(A()); 

Ở đây, tạm thời không nhất thiết chỉ còn sống trong dòng đó, nhưng có thể được xây dựng trực tiếp bên trong ngăn đối số của phương thức.

7

Tiêu chuẩn không ủy quyền bất kỳ vùng bộ nhớ nào (heap/stack) cho chúng, nhưng chúng giống như biến cục bộ "lưu trữ tự động", ở cuối biểu thức (hoặc lâu hơn khi được ràng buộc với một ref-to -const) chúng bị phá hủy.

Hầu hết các triển khai sẽ lưu trữ chúng trên ngăn xếp giống như các biến cục bộ.

chỉnh sửa:

Như James Kanze chỉ ra: Trong trường hợp thời gian tồn tại của một tạm thời được mở rộng thông qua một const ref-to-, vị trí cửa hàng của nó là trên hầu hết các triển khai phần nào xác định bởi vị trí lưu trữ của tham chiếu đó. Tức là, trong trường hợp tham chiếu đang được lưu trữ tĩnh, tạm thời sẽ là quá (chỉ được xác nhận trên gcc). (mặc dù IMHO trong khi điều này vẫn là một tạm thời trong ý nghĩa tiêu chuẩn, nó là lập luận cho dù đây là một tạm thời trong ý nghĩa tiếng Anh trực quan của từ đó)

+0

-1 và tôi sẽ giải thích lý do. Phạm vi không nhất thiết là kết thúc của biểu thức ngay cả khi không bị ràng buộc với tham chiếu const, nhưng nó có thể mở rộng hơn nữa do tối ưu hóa. Xem câu trả lời của tôi. –

+0

@LuchianGrigore: Vì vậy, trong ví dụ của bạn, tạm thời sẽ tồn tại sau khi 'foo();' trả về? bạn có thể trích dẫn từ tiêu chuẩn mà điều này được phép xảy ra không? – PlasmaHH

+0

@Luchian Grigore Đây http://stackoverflow.com/questions/9018778/will-temporary-object-be-deleted-if-there-is-no-const-reference-to-it nói rằng nó sẽ là kết thúc của biểu hiện, phải không? –

0

Hầu hết (nếu không phải tất cả) triển khai lưu trữ chúng trên stack (tức là tự động lưu trữ), mặc dù tôi không nghĩ rằng các nhiệm vụ tiêu chuẩn ở bất cứ đâu. Nó chắc chắn dễ dàng hơn để làm điều đó, vì trình biên dịch phải đảm bảo thời gian tồn tại của biến tạm thời, và có khả năng là tuổi thọ sẽ bao gồm một cuộc gọi đệ quy của cùng một hàm, tạo ra một thể hiện khác của biến tạm thời.

5

Điều đó phụ thuộc vào tuổi thọ của chúng. Thời gian bạn tạo bên trong một hàm mà bạn không ràng buộc với tham chiếu tĩnh cục bộ để kéo dài tuổi thọ của chúng sẽ rất có thể được tạo trên ngăn xếp. Các thời gian bạn liên kết với các tham chiếu tĩnh cục bộ sẽ rất có thể được lưu trữ trong phần .data của chương trình nhị phân của bạn. Các lưu giữ tương tự cho các thời gian bạn liên kết với các tham chiếu không phải là trung tâm. Các thời gian được tạo ra trong quá trình khởi tạo một biến nonlocal khác mà một trong những ràng buộc bởi một tham chiếu nên được trên stack của hàm tạo ra giá trị của biến nonlocal đó.

Các đối tượng ngoại lệ đại diện cho đối tượng được ném trong khi tháo cũng là các thời gian tạm thời. Những người thường cư trú trên đống.

+0

Cần lưu ý rằng câu trả lời của tôi bỏ qua sự hiện diện của các biến cục bộ luồng. ai đó đã trải nghiệm điều đó nên nói lên và làm rõ. –

+0

Thật vậy, trong khi OP có thể không có chúng trong tâm trí, ngoại lệ là tạm thời quá. Cũng như các danh sách intializer trong C++ 11. Đối với các biến địa phương luồng, ít nhất là trên x86_64/linux chúng sẽ được lưu trữ trong một phân đoạn bộ nhớ đặc biệt được truy cập với sự trợ giúp của thanh ghi phân khúc gs, được đặt khác nhau cho mỗi luồng. – PlasmaHH

+0

Các đối tượng ngoại lệ có phải là thời gian không? Hoặc cái gì khác hoàn toàn. (Trong §3.7, tiêu chuẩn liệt kê bốn "thời lượng lưu trữ": tĩnh, luồng, tự động và động. Tôi thường tự hỏi về điều này: thời gian rõ ràng có thời lượng khác nhau, cũng như các đối tượng ngoại lệ.) –