2016-04-17 19 views
13

Đối với những triển khai trình biên dịch có sử dụng vtables: có trường hợp nào khi bảng chức năng ảo được thay đổi trong thời gian chạy không? Hoặc vtables chỉ được điền vào lúc biên dịch và không có hành động nào được thực hiện để sửa đổi chúng trong thời gian chạy?Sửa đổi Vtable tại thời gian chạy

+2

Bạn sắp xếp những sửa đổi thời gian chạy nào hữu ích/có thể? –

+2

@ Cheersandhth.-Alf nếu đó là một chương trình C++ đơn giản hơn không, nó ngớ ngẩn. nhưng nếu anh ta (bây giờ hoặc trong tương lai) sẽ phải viết một cái gì đó như VM hoặc một trình biên dịch interperter/JIT hơn tôi sẽ không loại bỏ câu hỏi của mình quá nhanh –

+0

Đó là imp ... rất khó để tìm ra một thiết kế như vậy thread-safe, do đó, nó không được thực hiện. –

Trả lời

8

Tôi không biết bất kỳ C++ ABI nào có triển khai đa hình sử dụng các bảng ảo thay đổi khi chạy. Tuy nhiên, nó sẽ không hữu ích vì các bảng ảo thường mô tả một thuộc tính của mã (mối quan hệ của các hàm thành viên với mỗi vị trí khác trong phân cấp lớp) và mã C++ không thay đổi khi chạy.

Và bởi vì nó sẽ không hữu ích, nó sẽ lãng phí.

+0

Vtables có đi trên phần mã hoặc phần dữ liệu trong hình ảnh có thể thực thi không? –

+2

@KarolisM ilieška: Theo đó thực hiện? Và tại sao bạn cần biết? –

+0

Để cụ thể: ARM Keil, nhưng điều này cũng áp dụng cho gcc arm. 1. Tôi chỉ là currious, 2. Tôi làm việc với các hệ thống nhúng và đôi khi nó là cần thiết để biết nơi để đặt một số phần. –

2

Câu trả lời ngắn gọn là không.

Câu trả lời dài hơn (và có thể là triển khai cụ thể) là con trỏ của đối tượng đến các thay đổi vtable thực tế trong khi thực thi hàm tạo và hàm hủy của lớp đa hình, để các phương thức ghi đè trong lớp dẫn xuất không được thực thi bởi constructor/destructor của lớp cơ sở trong khi lớp dẫn xuất chưa được xây dựng/đã bị hủy.

Nếu bạn muốn đối tượng để thay đổi lớp trong thời gian chạy sau đó bạn có một số tùy chọn:

  1. Objective-C (++)

  2. tay mã cơ chế công văn của riêng bạn

  3. python/javascript etc al.

  4. (tùy chọn tốt nhất) xem xét lại thiết kế của bạn.

+1

Nó không phải là vtable thay đổi. Đó là thành viên vptr của đối tượng bị hủy diệt! –

+0

Ngoài ra, 'std :: function' có thể được gán lại vào thời gian chạy, vì vậy đây là một tùy chọn khác –

+0

@KerrekSB cố định, mặc dù tôi chắc chắn có từ ngữ tốt hơn –

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