2016-04-17 5 views
13

Для тех реализаций компилятора, которые используют vtables: существуют ли случаи, когда таблицы виртуальных функций изменяются во время выполнения? Или vtables только заполняется во время компиляции, и никаких действий не выполняется для их изменения во время выполнения?Изменения Vtable во время выполнения

+2

Какие модификации среды выполнения вы предполагаете полезными/возможными? –

+2

@ Cheersandhth.-Alf, если это простая программа на C++, чем нет, это глупо. но если он (сейчас или в будущем) должен будет написать что-то вроде VM или компилятора Interperter/JIT, я бы не отказался от его вопроса так быстро. –

+0

Это очень сложно придумать такой дизайн, который поточно-безопасный, так что это не сделано. –

ответ

8

Я не знаю ни одного C++ ABI с реализацией полиморфизма, который использует виртуальные таблицы, изменяющиеся во время выполнения.

Это было бы не очень полезно, так как виртуальные таблицы обычно описывают свойство кода (отношение функций-членов друг к другу по отношению к позиции w.r.t в иерархии классов), а код C++ не изменяется во время выполнения.

И поскольку это было бы не полезно, это было бы расточительно.

+0

Включены ли vtables в раздел кода или раздел данных в неизменяемом изображении? –

+2

@KarolisM ilieška: В соответствии с этой реализацией? И почему вам нужно знать? –

+0

Конкретно: ARM Keil, но это также относится к руке gcc. 1. Я просто currious, 2. Я работаю со встроенными системами, и иногда необходимо знать, где разместить некоторые разделы. –

2

Короткий ответ - нет.

Несколько более длинный (и, вероятно, специфичный для реализации) ответ заключается в том, что указатель объекта на фактический vtable изменяется во время выполнения конструктора и деструктора производного полиморфного класса, так что переопределенные методы в производном классе не выполняются конструктором/деструктором базового класса, в то время как производный класс еще не построен/был разрушен.

Если вы хотите объекты, чтобы изменить класс во время выполнения, то у вас есть несколько вариантов:

  1. Objective-C (++)

  2. ручной код собственный механизм доставки

  3. python/javascript etc al.

  4. (лучший вариант) пересмотреть ваш дизайн.

+1

Это не изменение vtable. Это элемент vptr уничтоженного объекта! –

+0

также, 'std :: function' можно переустановить во время выполнения, так что это еще один вариант –

+0

@KerrekSB исправлен, хотя я уверен, что есть лучшая формулировка –

Смежные вопросы