> -- Сергей Губанов писал(а):
> Есть ещё одна деталь. В вашей реализации тег типа (указатель на дескриптор типа) внедрён в структуру. То есть размер структуры получается всегда на 4 (или на  байтов больше чем сумма размеров её полей. Если мы разместим такую тегированную структуру в массиве, то размер массива увеличится на N * 4 (или на  байтов, где N - длина массива. В обероне же этого не произойдёт

1. Для организации message bus не нужны массивы структур.
2. Динамическая проверка типа вообще не имеет смысла для массива, тип его элементов всегда известен на этапе компиляции.

> -- Сергей Губанов писал(а):
> То же самое происходит при внедрении тегированной структуры внутрь другой структуры -- опять её тег помещается в дескриптор типа структуры контейнера.

Ну и какая разница где эти 4(8) байтов будут отжирать память - в аггрегированной структуре или в аггрегирующей (или в довеске, который ходит рядом с ними)?

> -- Сергей Губанов писал(а):
> То есть структура есть сама по себе, а тег её типа есть сам по себе, но компилятор всегда занет откуда его взять. Когда мы пишем в обероне:PROCEDURE Procedure (VAR r: MyRecord);то компилятор должен сгенерировать не один аргумент, а два -- тег типа передаётся в процедуру отдельно ("скрытым параметром").

Покажите мне документ, в котором написано, что "компилятор должен..."? В описании языка этого нет. Я понимаю зачем в реализации оберона разумно сделать именно так, но все же это особенности реализации. И я не пытался сдеалать оберон из C++.

Я решил конкретную задачу: "быстрая проверка динамического типа на C++". Решил ее применительно к считающемуся чуть ли не эксклюзивным для оберонов паттерну "message bus". Какого-то принципиального оверхеда применительно к этому паттерну вроде как нет. Есть немного вычурная запись для описания типов, ну и запись проверки типа не такая краткая как в обероне. Но зато мне не пришлось переписывать рантайм или компилятор