2016-01-13 17 views
13

Vì trình biên dịch của tôi cung cấp các thống kê khác nhau cho hai đoạn mã này, tôi tự hỏi điều gì làm cho chúng khác biệt, nếu có?Có sự khác biệt nào giữa hai biểu thức này không?

Đầu tiên một:

typedef const struct process_data 
{ 
    uint8_t *name; 
    void (*p_func)(void); 
} process_data_t; 

process_data_t processes = {15,16}; 

Và là một trong những thứ hai:

typedef struct process_data 
{ 
    uint8_t *name; 
    void (*p_func)(void); 
} process_data_t; 

const process_data_t processes = {15,16}; 

Lưu ý rằng const vòng loại đã chuyển từ typedefing với định nghĩa của cấu trúc. Đối với tôi không có sự khác biệt giữa hai đoạn trích, nhưng số liệu thống kê trình biên dịch/linker cho thấy rằng bộ nhớ flash ít hơn (nền tảng là vi điều khiển với các tài nguyên hạn chế) được sử dụng khi đoạn mã thứ hai được sử dụng.

+1

Xem xét sự khác biệt trong tệp 'map'. Và báo cáo lại :) –

+0

vui lòng cung cấp một ví dụ hoàn chỉnh hơn, chỉ đủ để hiển thị vấn đề. –

Trả lời

4

Có một số lượng tự do đó trình biên dịch có thể mất trong việc giải thích những tờ khai, nhưng, nói chung, đây là sự khác biệt:

  • Các typedef "nói": đây là một loại mà luôn luôn là const, có nghĩa là không có cách "hợp pháp" để loại bỏ const -nes của bất kỳ biến số nào trong số này là. Bất cứ khi nào bạn chuyển dữ liệu thuộc loại này hoặc con trỏ tới nó, chúng sẽ là const. Chắc chắn, truyền "hoạt động", nhưng chỉ cho một loại khác và có thể dẫn đến Hành vi không xác định.

  • Dữ liệu const "nói": Những thông tin này là const, nhưng, các dữ liệu khác thuộc loại này có thể không, vì vậy, ít nhất là một số lượng "lấy đi const -nes" là OK giữa các biến và các con trỏ này kiểu. Tất nhiên, nếu ai đó phôi con trỏ đến dữ liệu này để không-const và nó thực sự là trong bộ nhớ chỉ đọc, chúng tôi đang gặp rắc rối.

Vì vậy, dòng dưới cùng là giống nhau, nhưng có sự khác biệt nhỏ. Làm thế nào trình biên dịch giải thích rằng thực sự là lên đến trình biên dịch. Nó có thể rất tốt là typedef là rất hiếm (nó là trong kinh nghiệm của tôi), do đó, trình biên dịch được tối ưu hóa cho các trường hợp phổ biến hơn.

+0

Có, tôi thấy rằng đây là một vấn đề cụ thể của trình biên dịch. Nó diễn giải một hằng số được đặt trong bộ nhớ flash (ROM). Vấn đề thực sự ở đây là trong trình biên dịch này, một 'const' dường như là một khai báo cụ thể 'cho mỗi biến'. Nó không lan truyền thông qua một loại. Vì vậy, tôi loại lãng phí thời gian của bạn, mà tôi xin lỗi về. Dù sao cảm ơn tất cả các bạn. – Hairi

0

consts được lưu trữ trong bộ nhớ chỉ đọc - tôi đoán là bạn chỉ đang dịch chuyển dữ liệu ở đâu. Khó nói 100% mà không thấy thêm thông tin.

+3

Các đối tượng đủ điều kiện 'const' không nhất thiết được lưu trữ trong bộ nhớ chỉ đọc. Hãy xem xét 'const int r = rand();'. –

3

Có sự khác biệt giữa các định nghĩa dữ liệu được khai báo const và thường là const ness, ở đó nó trở thành hành vi không xác định (ít nhất là trong C++) nếu bạn bỏ đi const từ một đối tượng đã được xác định với vòng loại.

Bên ngoài ngôn ngữ lập pháp, lý do rõ ràng: chúng tôi muốn chúng như là một phần của hình ảnh chỉ đọc, trong khi vẫn cho phép cả những người biết họ đang làm gì để sử dụng const_cast, bởi vì có good reasons cho điều đó .

Trong C, chúng tôi có khá nhiều động lực tương tự: đặt hằng số vào bộ nhớ chỉ đọc, nhưng cho phép phôi hoạt động. Khi vòng loại được gắn vào loại, đó không phải là một đảm bảo mạnh mẽ rằng người dùng dự định biến để đi vào bộ nhớ chỉ đọc, do đó trình biên dịch có thể sai về mặt thận trọng ở đây.

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