Câu hỏi phỏng vấn quản lý bộ nhớ C++

Đây là danh sách các câu hỏi đại diện cho các vấn đề mọi người thường gặp phải với quản lý bộ nhớ. Một số câu trả lời xuất hiện bên dưới, với các liên kết đến tài liệu hỗ trợ hữu ích, chẳng hạn như , the và các trang web bên ngoài. Để có giải thích đầy đủ về bất kỳ thuật ngữ nào được sử dụng, hãy xem bảng thuật ngữ

Điều khoản khác

Tại sao đĩa của tôi rattle rất nhiều?

Khi bạn đang sử dụng một hệ thống, máy tính có thể phải tìm nạp bộ nhớ từ đĩa trước khi có thể truy cập chúng. Nếu tổng số chương trình đang hoạt động của bạn vượt quá khả dụng, sẽ xảy ra liên tục, đĩa của bạn sẽ kêu lạch cạch và hiệu suất sẽ giảm đáng kể. Các giải pháp duy nhất là cài đặt thêm bộ nhớ vật lý, chạy ít chương trình hơn cùng một lúc hoặc điều chỉnh các yêu cầu bộ nhớ cho chương trình của bạn

Vấn đề trở nên trầm trọng hơn vì các hệ thống bộ nhớ ảo xấp xỉ bộ làm việc lý thuyết với tập hợp các trang mà bộ làm việc nằm trên đó. Nếu tập hợp làm việc thực tế được trải ra trên một số lượng lớn các trang, thì tập hợp trang làm việc đó là lớn

Khi các đối tượng đề cập đến nhau ở xa trong bộ nhớ, điều này được gọi là kém. Điều này xảy ra do người thiết kế chương trình không lo lắng về điều này hoặc trình quản lý bộ nhớ được sử dụng trong chương trình không cho phép người thiết kế làm bất cứ điều gì về nó

Lưu ý rằng có thể tự động tổ chức dữ liệu của bạn theo các mẫu tham chiếu của chương trình và do đó giảm thiểu sự cố này

Tôi có thể tìm hiểu thêm về thu gom rác ở đâu?

Nhiều ngôn ngữ hiện đại đã được tích hợp sẵn và tài liệu ngôn ngữ sẽ cung cấp chi tiết. Đối với một số ngôn ngữ khác, có thể thêm bộ sưu tập rác, chẳng hạn như thông qua Hệ thống nhóm bộ nhớ hoặc bộ sưu tập Boehm–Demers–Weiser

Tôi có thể lấy một bộ thu gom rác ở đâu?

Memory Pool System và Boehm–Demers–Weiser Collector phù hợp với C hoặc C++. Tuy nhiên, cách tốt nhất để có được bộ thu gom rác là lập trình bằng ngôn ngữ cung cấp bộ thu gom rác nguyên bản

Tại sao chương trình của tôi sử dụng quá nhiều bộ nhớ?

Nếu bạn đang sử dụng (ví dụ: và trong ), có khả năng chương trình của bạn không thể giải phóng các khối bộ nhớ sau khi ngừng sử dụng chúng. Khi mã của bạn phân bổ bộ nhớ trên heap, có nghĩa vụ phải giải phóng bộ nhớ đó. Nếu một chức năng sử dụng bộ nhớ heap để trả về dữ liệu, bạn phải quyết định ai đảm nhận trách nhiệm đó. Đặc biệt chú ý đến giao diện giữa các chức năng và mô-đun. Hãy nhớ kiểm tra điều gì xảy ra với bộ nhớ được cấp phát trong trường hợp có lỗi hoặc ngoại lệ

Nếu bạn đang sử dụng (gần như chắc chắn), có thể mã của bạn đang ghi nhớ một số khối mà nó sẽ không bao giờ sử dụng trong tương lai. Điều này được gọi là sự khác biệt giữa và. Cân nhắc xóa các biến liên quan đến khối lớn hoặc mạng khối, khi cấu trúc dữ liệu không còn cần thiết

Tôi sử dụng thư viện và chương trình của tôi phát triển mỗi khi tôi gọi nó. Tại sao?

Nếu bạn đang sử dụng , có khả năng thư viện đang phân bổ cấu trúc dữ liệu trên heap mỗi khi nó được sử dụng, nhưng chúng không được giải phóng. Kiểm tra tài liệu giao diện cho thư viện; . Có thể cần phải đóng thư viện và khởi tạo lại nó để khôi phục bộ nhớ đã cấp phát

Thật không may, rất có thể thư viện có lỗi quản lý bộ nhớ. Trong trường hợp này, trừ khi bạn có mã nguồn, bạn không thể làm gì khác ngoài việc báo cáo sự cố cho nhà cung cấp. Có thể thêm trình thu gom rác vào ngôn ngữ của bạn và điều này có thể giải quyết vấn đề của bạn

Với một , đôi khi các đối tượng được giữ lại vì có một tham chiếu đến chúng từ một số cấu trúc dữ liệu toàn cầu. Mặc dù thư viện có thể không sử dụng thêm các đối tượng, nhưng người thu thập phải giữ lại các đối tượng vì chúng vẫn còn.

Nếu bạn biết rằng một tham chiếu cụ thể sẽ không bao giờ được sử dụng trong tương lai, bạn có thể ghi đè lên nó. Điều này có nghĩa là trình thu thập sẽ không giữ lại đối tượng được giới thiệu vì tham chiếu đó. Các tham chiếu khác đến cùng một đối tượng sẽ giữ nó, vì vậy chương trình của bạn không cần phải xác định liệu chính đối tượng đó có bao giờ được truy cập trong tương lai hay không. Điều này nên được thực hiện một cách thận trọng, sử dụng các công cụ của trình thu gom rác để tìm đối tượng nào đang được giữ lại và tại sao

Nếu bộ thu gom rác của bạn là , có thể bạn đang mắc phải , điều này thường có thể được giải quyết bằng cách điều chỉnh bộ thu gom hoặc sử dụng một vùng bộ nhớ riêng cho thư viện

Tại sao tôi không thể chỉ sử dụng dữ liệu cục bộ trên ngăn xếp hoặc trong các biến toàn cục?

Dữ liệu toàn cầu hoặc tĩnh có kích thước cố định; . Dữ liệu được cấp phát theo ngăn xếp không tồn tại khi bạn rời khỏi hàm (hoặc khối chương trình) mà nó được khai báo

Nếu các yêu cầu bộ nhớ của chương trình của bạn hoàn toàn có thể dự đoán được và cố định tại thời điểm biên dịch hoặc bạn có thể cấu trúc chương trình của mình để chỉ dựa vào dữ liệu ngăn xếp khi nó tồn tại, thì bạn hoàn toàn có thể tránh sử dụng cấp phát heap. Lưu ý rằng, với một số trình biên dịch, việc sử dụng các khối bộ nhớ chung lớn có thể làm tăng kích thước tệp đối tượng

Việc phân bổ một khối toàn cầu có vẻ “có thể đủ lớn” cho bất kỳ tập hợp dữ liệu hợp lý nào thường có vẻ đơn giản hơn, nhưng sự đơn giản hóa này gần như chắc chắn sớm muộn sẽ gây ra rắc rối

Tại sao tôi phải lo lắng về bộ nhớ ảo?

Mặc dù có thể tăng đáng kể khả năng lưu trữ dữ liệu của bạn, nhưng có ba vấn đề thường gặp phải với nó

  • Nó không cung cấp dung lượng bộ nhớ không giới hạn. Đặc biệt, tất cả bộ nhớ mà bạn thực sự phân bổ (trái ngược với dự trữ) phải được lưu trữ ở đâu đó. Thông thường, bạn phải có sẵn dung lượng đĩa cho tất cả các trang chứa bộ nhớ được phân bổ. Trong một số hệ thống, bạn có thể trừ bộ nhớ vật lý khả dụng khỏi dung lượng ổ đĩa cần thiết. Nếu bộ nhớ chứa hình ảnh của tệp chương trình hoặc tệp dữ liệu, thì hoặc gán các tệp hiện có cho các vùng của không gian địa chỉ ảo, có thể giúp ích đáng kể

  • Trong hầu hết các máy tính, có sự khác biệt lớn về tốc độ giữa bộ nhớ chính và ổ đĩa;

  • Một vấn đề khác với việc sử dụng số lượng bộ nhớ không cần thiết là bộ nhớ kém có thể dẫn đến phân trang nặng.

    Làm thế nào bộ nhớ được quản lý trong C?

    Phân bổ bộ nhớ tĩnh . Yêu cầu bộ nhớ chính xác phải được biết trước vì một khi bộ nhớ được cấp phát thì không thể thay đổi được. the operating system internally uses a data structure known as stack to manage the memory. Exact memory requirements must be known in advance as once memory is allocated it can not be changed.

    Cấp phát bộ nhớ động trong các câu hỏi phỏng vấn C là gì?

    Cấp phát bộ nhớ động trong C

    Có bao nhiêu chức năng quản lý bộ nhớ trong C?

    There are 4 library functions provided by C defined under header file to facilitate dynamic memory allocation in C programming. They are: malloc() calloc()