2012-11-08 37 views
10

Dưới đây là một ví dụ mã:Là hằng số hằng số chức năng nội tuyến duy nhất?

enum Foo // or enum class whatever 
{ BAR 
, STUFF 
}; 

inline const char* to_string(const Foo& foo) 
{ 
    static const char* const NAMES[] = 
    { "BAR" 
    , "STUFF" 
    }; 
    // let's assume I have some boundary checks here, it's not the point 
    return NAMES[foo]; 
}; 

Chức năng này là inline, là trong một tiêu đề được sử dụng trong một số đơn vị biên dịch. Mục tiêu ở đây là làm cho trình biên dịch không làm gì nếu không sử dụng chức năng này.

Câu hỏi:

  1. Liệu C++ đảm bảo tiêu chuẩn mà tên sẽ chỉ tồn tại trong một tập tin đối tượng, hoặc là nó để lại cho trình biên dịch để quyết định hay nó đảm bảo rằng tất cả các tập tin đối tượng sẽ có nó là bản sao?
  2. Nếu có nhiều bản sao, nó sẽ là một vấn đề liên kết (tôi giả sử tôi không thể kiểm tra đủ trình biên dịch để kiểm tra điều đó).
  3. Gcc, msvc và clang tất cả tối ưu hóa trong trường hợp này bằng cách làm cho nhị phân cuối cùng chỉ có một thể hiện của NAMES?
+1

Một câu hỏi cho mỗi câu hỏi, vui lòng. –

+2

@LightnessRacesinOrbit: "Yo dawg, tôi nghe bạn thích câu hỏi, vì vậy tôi đặt câu hỏi trong câu hỏi của tôi để bạn có thể trả lời trong khi bạn trả lời ..." – Mehrdad

+4

Tôi muốn nói những câu hỏi này được kết nối đủ để được đăng trong một câu hỏi. – leftaroundabout

Trả lời

7

Có, tiêu chuẩn đảm bảo rằng sẽ chỉ có một đối tượng. Từ C++ 03 §7.1.2/4:

[...] Một static biến cục bộ trong một chức năng extern inline luôn đề cập đến cùng một đối tượng. Một chuỗi ký tự trong một hàm nội tuyến bên ngoài là cùng một đối tượng trong các đơn vị dịch khác nhau.

(Lưu ý rằng một chức năng extern inline là một chức năng inline với mối liên hệ bên ngoài, tức là một chức năng inline không được đánh dấu như static.)

Chính xác mà đối tượng nộp nó xuất hiện trong sẽ phụ thuộc vào trình biên dịch, nhưng những gì tôi nghi ngờ xảy ra là mỗi tập tin đối tượng sử dụng nó sẽ nhận được một bản sao, và linker sẽ tự ý chọn một trong các biểu tượng và loại bỏ phần còn lại.

+0

Điều gì sẽ xảy ra nếu nó được đánh dấu là tĩnh? – imreal

+1

@Nick: Sau đó, tiêu chuẩn không đảm bảo. –

+0

@Nick: Có lẽ do "nó" bạn có nghĩa là chức năng. –

1

Chuẩn đảm bảo rằng chỉ một bản sao sẽ là được sử dụng. Nó không đảm bảo rằng sẽ không có bản sao không sử dụng chiếm không gian trong mã.

Trình liên kết thường chịu trách nhiệm tổng hợp tất cả các tham chiếu để sử dụng cùng một trường hợp.

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