C ++ и двоичная совместимость: возвращение структуры POD по значению - PullRequest
1 голос
/ 08 июня 2011

Рассмотрим следующий код C ++:

struct X
{
        int a;
        int b;
};

X foobar()
{
        X x = { 1, 2 };
        return x;
}

Теперь предположим, что этот код помещен в общую библиотеку, которая используется сторонними приложениями.

Мой вопрос: если я добавлю другого участника в конце X (например, int c) и инициализирую его в foobar(), будут ли существующие приложения, которые вызывают foobar(), сломаться? Обратите внимание, что речь идет о двоичной совместимости, а не о совместимости с исходным кодом.

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Поскольку размер Х изменится, да. Массивы и тому подобное зависят от размеров. Возможно, вам повезет, и заполнение может позволить более старым приложениям использовать более новую библиотеку, но это будет просто удача.

3 голосов
/ 08 июня 2011

Это полностью зависит от того, что ваш компилятор решит сделать (точнее, от того, что диктует платформа ABI).

Вы можете себе представить, что если возвращаемое значение помещается в стек, теперь вы будете записывать в стек больше, чем ожидает вызывающий объект, что может привести к печати на чем-либо.

В общем, вы не должны полагаться на какое-либо конкретное поведение. Вы просто должны перекомпилировать клиентские приложения. Единственная реалистичная альтернатива - это что-то вроде PIMPL идиома .

...