2012-08-28 42 views
7

Có bất kỳ đảm bảo rằng các chức năng khác nhau chỉ bởi tên của nó (không phải thông số và kiểu trả về cũng không thể chia sẻ cùng một địa chỉ trong C và C++? Tôi không thấy gì về nó trong tiêu chuẩn.Con trỏ của một số chức năng

#include <cassert> 

void foo() {} 

void bar() {} 

int main() 
{ 
    assert(foo != bar); 
} 

Trả lời

7

Tiêu chuẩn C++ 11 nói

5,10 khai thác bình đẳng
Pointers cùng loại (sau khi chuyển đổi con trỏ) có thể được so sánh cho sự bình đẳng. Hai con trỏ của cùng một loại so sánh bằng nhau nếu và chỉ khi chúng đều là null, cả hai đều trỏ đến cùng một hàm, hoặc cả hai đều đại diện cho cùng một địa chỉ (3.9.2).

Nếu bạn không có bất kỳ gợi ý nào về chức năng, họ chỉ có thể có cùng một địa chỉ, nhưng chúng tôi sẽ không biết. Nếu bạn so sánh con trỏ với hai hàm khác nhau, chúng không được so sánh bằng nhau.


Một nguyên nhân cho sự nhầm lẫn có thể là các trình biên dịch MSVC được biết là kết hợp mã cho chức năng mẫu điều đó xảy ra để sản xuất mã máy giống hệt với nhiều loại khác nhau (như intlong). Điều này không tuân thủ.

Tuy nhiên, đây là chức năng với khác nhau chữ ký và không chính xác câu hỏi này là gì.

+0

Nhận xét cuối cùng không có ý nghĩa ngay bây giờ. Đối với các loại đối số khác nhau, bạn có các con trỏ hàm khác nhau, vì vậy quy tắc về "Hai con trỏ [hàm] cùng loại" không còn áp dụng nữa. – MSalters

+0

Đó là sự thật. Đó là nhiều hơn về một trường hợp mà chúng tôi đã thấy rằng các chức năng khác nhau * có thể * nhận được cùng một địa chỉ, nhưng không thực sự là câu hỏi được hỏi, –

1

Chi tiết triển khai.

(C99, 5.1.2.3p1) "Mô tả ngữ nghĩa trong tiêu chuẩn này mô tả hành vi của một máy trừu tượng trong đó các vấn đề tối ưu hóa không liên quan."

+0

Trích dẫn là không đúng sự thật. Câu hỏi đặt ra là một trình biên dịch thực, khác với các máy trừu tượng, nhưng (ngay cả trong sự hiện diện của tối ưu hóa) cũng phải thể hiện hành vi quan sát giống như một trong các máy trừu tượng được phép. – MSalters

3

Có. C99 6.5.10: 6

Hai con trỏ so sánh bằng khi và chỉ khi cả hai đều là con trỏ null, cả là con trỏ đến cùng một đối tượng (trong đó có một con trỏ đến một đối tượng và một subobject tại của nó bắt đầu) hoặc chức năng ...

Edit: phần còn lại của đoạn văn, vì nó hóa ra có một số quan trọng:

cả hai đều là con trỏ tới một phần tử cuối cùng của cùng một đối tượng , hoặc một là một con trỏ đến một trong quá khứ của một đối tượng mảng và khác là con trỏ đến đầu của đối tượng mảng khác nhau xảy ra ngay lập tức theo đối tượng mảng đầu tiên trong không gian địa chỉ .

Những gì tôi mất từ ​​nó:

  • bình đẳng áp dụng cho các toán hạng sai, trong rất nhiều từ, không xác định. Nó có thể được vô tình đúng vì các lý do không liên quan nhưng nó không phải là không xác định khi bạn sử dụng nó sai cách < là không xác định khi bạn sử dụng nó sai.
  • theo sự hiểu biết tốt nhất của tôi, phần còn lại của đoạn văn không áp dụng cho các hàm, bởi vì hàm không phải là đối tượng hay nó cũng không thể là phần tử của mảng.
+0

Sau đó, không nên thực hiện đảm bảo rằng họ là -actually- chức năng tương tự? Tôi có nghĩa là, nó tốt đẹp mà trình biên dịch tối ưu hóa này nhưng chức năng ngôn ngữ-spec có vẻ khác với tôi hơn so với các chức năng lắp ráp sau khi biên dịch. –

+0

Lấy từ câu trả lời của Bo, phần cuối cùng là "hoặc cả hai đại diện cho cùng một địa chỉ". Phần cuối cùng của câu nói này có giống nhau không? –

+0

@DanielSloof Tôi nghĩ rằng điều đó phụ thuộc vào những gì xảy ra sau khi '...'. –

2

Nhiều trình biên dịch có bật tối ưu hóa sẽ làm cho hai hàm có cùng địa chỉ. Ví dụ, từ msdn:

/OPT: ICF có thể dẫn đến cùng một địa chỉ được giao cho khác nhau chức năng hoặc chỉ đọc sách thành viên dữ liệu (biến const biên soạn với /Gy). Vì vậy,/OPT: ICF có thể phá vỡ một chương trình phụ thuộc vào địa chỉ của các hàm hoặc các thành viên dữ liệu chỉ đọc khác nhau. Xem/Gy (Bật Liên kết cấp chức năng) để biết thêm thông tin.

ICF: Giống hệt Code Folding

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