2010-02-19 16 views
6

Tôi có một câu hỏi để làm rõ sự nhầm lẫn của tôi về tổ chức bộ nhớ trong máy tính trong C++.phần dữ liệu trong C++

Trong C++, dữ liệu khác nhau được đặt ở vị trí khác. Sự hiểu biết của tôi là như thế này.

1) phần phân đoạn dữ liệu, nơi dữ liệu chung và dữ liệu tĩnh được đặt;

2) phần heap, các đối tượng được tạo ra bởi ngăn xếp phần mới

3), các biến địa phương

4) phần văn bản, mã riêng của mình.

Đúng không? Có bất cứ điều gì tôi bị mất hoặc đã làm sai?

Cảm ơn!

+0

Thực ra điều đó phụ thuộc vào định dạng đối tượng. Chỉ để làm cho nó khó hiểu hơn, trong Mach-O, ví dụ, tất cả ** dữ liệu ** liên tục sẽ được lưu trữ trong phân đoạn '__TEXT'. Và sau đó cũng có '__LINKEDIT' phân đoạn để giúp' dyld' cho liên kết động, vv – kennytm

+1

Vấn đề chính với câu hỏi của bạn là bạn cho rằng có một số loại tiêu chuẩn ở đây, trong khi đó chỉ là thực hành phổ biến. Mặc dù tổ chức bạn đề cập là phổ biến và hợp lý nhưng nó không phổ biến và có thể khác nhau giữa các triển khai. –

+0

Một vấn đề khác là tiêu chuẩn ngôn ngữ (đặc điểm kỹ thuật) không yêu cầu phần hoặc phân đoạn dữ liệu. Ngôn ngữ chỉ định các thuộc tính (đọc hoặc viết, công khai, riêng tư) và thời gian sống của một đối tượng. Các phần dữ liệu phụ thuộc vào trình biên dịch hoặc phiên dịch và có thể khác nhau giữa các nhà sản xuất và các phiên bản. –

Trả lời

4

Here is a guide có thể hữu ích.

+0

Đây là một câu hỏi rất cũ và David đã không đăng nhập trong một năm, nhưng một câu trả lời chỉ liên kết với một liên kết chết không phải là rất hữu ích cho trang web này –

+0

@en_Knight Liên kết được thay thế bằng liên kết từ Lưu trữ Internet; cùng một tài liệu. Tôi đã đăng nhập vào trang web này trong năm qua, nhưng hoạt động mạng SE của tôi hiện đang tập trung vào UX và Freelancing vì tôi đã thay đổi nghề nghiệp. – David

+0

wow ... thật tuyệt ... cảm ơn bạn! –

1

Thường có ít nhất hai phần dữ liệu. Một với globals khởi tạo, khác mà không có (BSS). Một phần ngăn xếp thường không được phát ra trong tệp nhị phân.

Tất nhiên, những loại câu hỏi cụ thể rất triển khai này là vô ích nếu bạn không chỉ định việc triển khai.

+0

Thực sự rất cụ thể nhưng hơn 15 năm tôi chưa bao giờ làm việc với một trình liên kết không tạo ra ít nhất .text, .data và .bss. Tôi cũng đã gặp phải .sdata (cho tất cả các biến tĩnh) khá một vài lần quá – zebrabox

0

tôi đã viết một bài báo mang tên "C++ Internals :: Memory Layout" mà sẽ làm rõ điều này cho bạn.

đoạn trích ngắn từ bài viết:

.text segment

Đó là một phân khúc Read-Only, kích thước cố định.

Đoạn văn bản, đoạn mã a.k.a., chứa các hướng dẫn thực thi được trình biên dịch và trình biên dịch cung cấp.

.data segment

Đó là một Read-Viết, phân khúc kích thước cố định.

Các phân đoạn dữ liệu, phân đoạn dữ liệu còn được gọi là khởi tạo, chứa khởi tạo:

  • biến toàn cầu (bao gồm cả các biến tĩnh toàn cầu)
  • biến cục bộ tĩnh.

Kích thước của phân đoạn phụ thuộc vào kích thước của các giá trị trong mã nguồn, các giá trị có thể được thay đổi trong thời gian chạy.

.rdata/.rodata segment

Đó là một Read-Only phân khúc

Các phân đoạn chứa dữ liệu vô danh tĩnh (như hằng chuỗi)

.bss segment

Đó là Đọc-Viết và tiếp giáp với đoạn .data.

Phân đoạn BSS, phân đoạn dữ liệu không được khởi tạo, chứa các biến được phân bổ tĩnh (toàn cục và tĩnh) được biểu diễn bằng các bit không có giá trị khi bắt đầu chương trình. BSS là viết tắt của Block Started by Symbol, một hoạt động giả đã tồn tại trong một bộ assembler rất cũ được phát triển cho IBM.

heap & stack

Bạn đang hoàn toàn đúng về những người. Dù sao, nếu bạn muốn kiểm tra một số ví dụ và có được một cái nhìn gần hơn, xin vui lòng, tham khảo bài viết đã đề cập.

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