2010-08-02 26 views
6

Tôi đang gặp vấn đề lạ tôi đã có thể theo dõi phần nào nhưng tôi vẫn không thể thấy nguyên nhân. Có lẽ ai đó ở đây có thể làm sáng tỏ một chút?Độ phân bổ bộ nhớ cấp chủ đề trên nền tảng được nhúng

Tôi đang chạy trên bộ xử lý PowerPC trên đầu VxWorks 5.5 đang phát triển trong C++ bằng chuỗi công cụ PPCgnu604.

Tôi có một lớp học như vậy:

class MyClass 
{ 
    public: 
    void run(void); 
    private: 
    CommandMesssageClass command; 
    StatusMessageClass status; 
}; 

Khi ứng dụng của tôi được bắt đầu, nó sẽ tự động phân bổ một thể hiện của MyClass và đẻ trứng một sợi chỉ vào chức năng "chạy" của nó. Về cơ bản nó chỉ ngồi đó bỏ phiếu cho các lệnh và, sau khi nhận được, sẽ phát hành lại trạng thái.

Lưu ý rằng đây là phiên bản rút gọn của lớp học. Có một số phương pháp khác và các biến còn lại cho ngắn gọn. Vấn đề tôi thấy là khi cả hai lệnh và thông điệp trạng thái được định nghĩa là thành viên lớp riêng tư, tôi sẽ nhận được một sự thay đổi trong các byte có sẵn trong bộ nhớ mặc dù thực tế không nên có phân bổ bộ nhớ động. Điều này là quan trọng bởi vì điều này là làm tròn trong những gì cần phải là một thủ tục xác định và an toàn tốc độ.

Nếu tôi di chuyển một hoặc cả hai khai báo thư vào hàm chạy, nó hoạt động tốt mà không có phân bổ bổ sung!

Tôi phải thiếu một số điều cơ bản trong sự hiểu biết về khai báo C++ và cấp phát bộ nhớ. Sự hiểu biết của tôi là một cá thể lớp mà tôi tự động instansiate sẽ được phân bổ đầy đủ trên heap (bao gồm tất cả các biến thành viên) khi nó được tạo ra. Sự khác biệt mà tôi thấy ở đây sẽ là việc di chuyển các khai báo thông báo đến hàm chạy sẽ đặt chúng vào ngăn xếp thay thế. Heap trong trường hợp này là quá đủ lớn để đi kèm với toàn bộ kích thước của lớp. Tại sao nó dường như không được phân bổ đủ bộ nhớ cho đến khi các phần cụ thể được sử dụng?

Lớp thông báo không phân bổ động của riêng chúng. (Và nếu họ đã làm, tôi sẽ mong đợi di chuyển tuyên bố sẽ không thay đổi hành vi trong trường hợp này và tôi vẫn sẽ thấy một sự thay đổi trong kích thước của đống.)

Để giám sát việc cấp phát bộ nhớ Tôi đang sử dụng như sau VxWorks memLib (hoặc memPartLib) gọi:

memPartInfoGet(memSysPartId, &partitionStatus); 
... 
bytesFree = partitionStatus.numBytesFree; 

Edit:

Để làm rõ, đối tượng MyClass được instansiated và khởi tạo trong một thói quen khởi và sau đó mã đi vào chế biến tỷ lệ an toàn. Trong thời gian này, khi nhận được một thông báo lệnh qua một dòng nối tiếp (tương tác đầu tiên với các đối tượng thông báo Lệnh hoặc Trạng thái), bộ nhớ bổ sung được cấp phát (hoặc thay vì số byte tự do giảm). Điều này là xấu bởi vì phân bổ bộ nhớ động không phải là xác định.

Tôi đã có thể loại bỏ vấn đề bằng cách di chuyển các biến lớp như tôi đã mô tả.

+0

Không rõ ràng vấn đề của bạn là gì, bạn có sử dụng nhiều bộ nhớ phân bổ các thứ như thành viên lớp vs trên ngăn xếp hay bộ nhớ được sử dụng thay đổi theo thời gian trong một trong các trường hợp? – nos

+1

Sizeof (MyClass) có thay đổi khi bạn nâng các thành viên lên khu vực công cộng không? Và phân bổ bộ nhớ thay đổi bao nhiêu? –

+1

* Khi nào thay đổi phân bổ? Các đối tượng lớp nhỏ hơn có thời gian dễ dàng hơn trong một khối miễn phí trên heap. –

Trả lời

2

Tôi phải thiếu một cái gì đó cơ bản trong sự hiểu biết của tôi về C++ tuyên bố và cấp phát bộ nhớ.

Tôi không nghĩ vậy. Tất cả mọi thứ bạn nói rằng bạn mong đợi ở trên là chính xác - người lập trình game dựa nhiều vào hành vi này mọi lúc.:-)

Tại sao dường như không phân bổ đủ bộ nhớ cho đến khi các phần cụ thể được sử dụng?

Bạn đã bỏ qua sự can đảm của lớp học ngắn gọn. Tôi đã có một số kinh nghiệm gỡ lỗi các vấn đề tương tự, và dự đoán tốt nhất của tôi là ở đâu đó trong đó chức năng thư viện , trên thực tế, tạo phân bổ thời gian chạy mà bạn không biết.

Nói cách khác, phân bổ thời gian chạy có trong cả hai trường hợp, nhưng hai kích thước khác nhau của MyClass có nghĩa là các hồ bơi malloc được lấp đầy khác nhau. Bạn có thể chứng minh điều này bằng cách di chuyển các đối tượng vào ngăn xếp bên trong run(), nhưng đệm MyClass ra cùng kích thước. Nếu bạn vẫn thấy thả mem miễn phí, thì nó không liên quan gì đến việc các đối tượng đó có trên đống hay ngăn xếp ... đó là một hiệu ứng phụ đang xảy ra do kích thước của MyClass.

Hãy nhớ rằng, malloc là chunky - hầu hết các triển khai không thực hiện phân bổ một-một cho mỗi cuộc gọi đến malloc. Thay vào đó nó phân bổ quá mức và giữ bộ nhớ xung quanh trong một hồ bơi, và phát triển những hồ bơi khi cần thiết.

Tôi không quen thuộc với chuỗi công cụ của bạn, nhưng các nghi ngờ điển hình cho các phân bổ nhỏ không mong muốn trên các hệ thống nhúng bao gồm chức năng ctype (miền địa phương) và chức năng ngày/giờ (múi giờ).

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