Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Phần tử vector ở trên heap hay stack?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    513

    Mặc định Phần tử vector ở trên heap hay stack?

    Với khai báo "vector<int> vect{1, 2, 3, 4};"
    thì các phần tử của "vect" nằm ở đâu, trên stack hay trên heap?

    Với code sau
    C++ Code:
    1. class Cls
    2. {
    3. public:
    4.     int n;
    5. };
    6. int main()
    7. {
    8.     Cls obj{11};//giá trị trường n = 11 sẽ nằm ở đâu?
    9. }
    thì giá trị trường n = 11 sẽ nằm ở đâu?
    Cùng câu hỏi trên với các kí tự trong "string"?
    Đã được chỉnh sửa lần cuối bởi khoaph : 20-11-2020 lúc 08:48 AM.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    933

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Với khai báo "vector<int> vect{1, 2, 3, 4};"
    thì các phần tử của "vect" nằm ở đâu, trên stack hay trên heap?

    Với code sau
    C++ Code:
    1. class Cls
    2. {
    3. public:
    4.     int n;
    5. };
    6. int main()
    7. {
    8.     Cls obj{11};//giá trị trường n = 11 sẽ nằm ở đâu?
    9. }
    thì giá trị trường n = 11 sẽ nằm ở đâu?
    Cùng câu hỏi trên với các kí tự trong "string"?
    Hằng số 11 hay các ký tự trong hằng chuỗi sẽ nằm trên vùng dữ liệu chương trình khi bộ nạp của HĐH nạp chương trình lên bộ nhớ. Với Windows thì vùng dữ lệu này nằm trong các section có thuộc tính chỉ đọc, tên của section này có thể là ".data", ".rdata", ".rrs", ... tùy thuộc vào sở thích của TBD đã biên dịch ra chương trình. Như vậy, các hằng không nằm trên Heap cũng không nằm trên Stack.😅😅😅

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    513

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Hằng số 11 hay các ký tự trong hằng chuỗi sẽ nằm trên vùng dữ liệu chương trình khi bộ nạp của HĐH nạp chương trình lên bộ nhớ. Với Windows thì vùng dữ lệu này nằm trong các section có thuộc tính chỉ đọc, tên của section này có thể là ".data", ".rdata", ".rrs", ... tùy thuộc vào sở thích của TBD đã biên dịch ra chương trình. Như vậy, các hằng không nằm trên Heap cũng không nằm trên Stack.😅😅😅
    À, vậy là có những vùng bộ nhớ khác stack và heap
    Thanks bạn.

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    513

    Xin lỗi bạn, mình diễn đạt không tốt lắm
    Ý mình là vị trí của các biến vect[0], vect[1], ..., obj.n, hay chuoikytu[0], chuoikytu[1], ...
    Không phải vị trí của các hằng 1, 2, 3, 4 hay 11,
    trước đây mình cứ nghĩ là các hằng trên tồn tại ở dạng literal trong các câu lệnh assembly
    Đã được chỉnh sửa lần cuối bởi khoaph : 05-12-2020 lúc 08:50 PM.

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    3,768

    Trước đây trong 4rum có một số topic bàn về convert xi sang asm, chụi khó tìm xem để biết : nó ở dạng literal trong các câu lệnh assembly hay không.

    ...
    ..
    .

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    933

    Mặc định Phần tử vector ở trên heap hay stack?

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Xin lỗi bạn, mình diễn đạt không tốt lắm
    Ý mình là vị trí của các biến vect[0], vect[1], ..., obj.n, hay chuoikytu[0], chuoikytu[1], ...
    Không phải vị trí của các hằng 1, 2, 3, 4 hay 11,
    trước đây mình cứ nghĩ là các hằng trên tồn tại ở dạng literal trong các câu lệnh assembly
    Đúng vậy bạn, ngữ cảnh khác nhau thì khi biên dịch nó khác nhau.

    Ví dụ :
    type Function()
    {
    int a = 1; // lệnh 1
    a += 5; // lệnh 2
    char * str = "abcd"; // lệnh 3
    char szText[] = "mnijk"; // lệnh 4
    }

    Giá trị 1 trong lệnh 1 là hằng lưu trong tập tin chương trình exe.
    Giá trị 5 trong lệnh 2 là được nhập trung trong mã lệnh đã biên dịch.(imme...)
    Trong lệnh 3, "abcd" là nằm ở vùng dữ liệu khởi tạo trước của chương trình, biến str trỏ tới vị trí của nó.
    Trong lệnh 4, biến szText nằm trên Stack được cấp phát 6 bytes (có thể canh chỉnh 8 bytes), chuỗi "mnijk" là hằng trên vùng dữ liệu khởi tạo trước - chỉ đọc. Khi vào hàm, mã lệnh biên dịch sẽ copy chuỗi "mnijk" tới vùng 6 bytes (hoặc 8) tại địa chỉ bắt đầu szText.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn