2011-07-26 21 views
12

Có hai loại câu hỏi liên quan ở đây:C++: Có tốt hơn để vượt qua một enum như một giá trị hoặc như một tham chiếu const?

A) Enum được triển khai như thế nào? Ví dụ: nếu tôi có mã:

enum myType 
{ 
    TYPE_1, 
    TYPE_2 
}; 

Điều gì đang thực sự xảy ra? Tôi biết rằng bạn có thể xử lý TYPE_1 và TYPE_2 dưới dạng int, nhưng chúng thực sự chỉ là ints?

B) Dựa trên thông tin đó, giả sử rằng enum được truyền vào không cần phải thay đổi, sẽ có ý nghĩa hơn khi chuyển myType vào một hàm làm giá trị hoặc tham chiếu const không?

Ví dụ, đó là sự lựa chọn tốt hơn:

void myFunction(myType x){ // some stuff } 

hoặc

void myFunction(const myType& x) { // some stuff } 

Trả lời

11

Tốc độ khôn ngoan gần như chắc chắn không quan trọng - bất kỳ trình biên dịch C++ nào cũng chỉ cần chuyển một int đơn lẻ.

Điểm quan trọng là khả năng đọc - điều này sẽ làm cho mã của bạn rõ ràng hơn với người đọc?

Nếu rõ ràng là những enums này thực sự chỉ là ints thì tôi sẽ chuyển chúng theo giá trị, như thể chúng là ints. Sử dụng const ref có thể làm cho một lập trình viên suy nghĩ hai lần (không bao giờ là ý tưởng hay!)

Tuy nhiên - nếu sau này bạn sẽ thay thế chúng bằng một lớp rồi giữ nguyên API và thực thi const-ness .

0

vượt qua được xây dựng trong các loại đơn giản (char, short, int, enum, float, con trỏ) theo giá trị

enums được triển khai dưới dạng số nguyên, bạn thậm chí có thể xác định rõ ràng các giá trị cho chúng.

0
typedef enum 
{ 
    FIRST_THING, 
    SECOND_THING 
} myType; 

Sau đó, sử dụng nó giống như int. Chuyển nó theo giá trị.

1

Tôi biết rằng bạn có thể xử lý TYPE_1 và TYPE_2 dưới dạng int, nhưng thực ra chúng có chỉ là ints không?

Có. Chúng là loại không thể tách rời và rất có thể loại của chúng chỉ là int vì đó là loại tự nhiên nhất. Vì vậy, bạn có thể vượt qua theo giá trị; đi qua tham chiếu sẽ không cho bạn bất kỳ lợi thế đáng kể nào.

Bằng cách này, để bạn tham khảo, phần §7.2/5 nói,

Các loại cơ bản của một liệt kê là một loại không thể thiếu mà có thể đại diện cho tất cả các giá trị điều tra viên xác định trong kiểu liệt kê. Nó là được định nghĩa thực hiện loại tích phân được sử dụng làm loại nội bộ cho kiểu liệt kê ngoại trừ loại cơ bản không được là lớn hơn int trừ khi giá trị của điều tra không thể khớp trong số hoặc int không dấu. Nếu danh sách liệt kê trống, kiểu cơ bản giống như điều tra có một điều tra viên duy nhất có giá trị 0.Giá trị của sizeof() được áp dụng cho một kiểu liệt kê, một đối tượng là kiểu liệt kê, hoặc một điều tra viên, là giá trị của sizeof() áp dụng cho loại cơ bản.

8

C++ tiêu chuẩn (§ 7.2/5) đảm bảo rằng kiểu liệt kê cơ bản là một loại tích phân có thể đại diện cho tất cả các giá trị điều tra được xác định trong điều tra. Vì vậy, vượt qua nó theo giá trị và không làm cho mã của bạn tinh vi hơn mà nó có thể được.