简体   繁体   中英

C++ and binary compatibility: returning a POD struct by value

Consider the following C++ code:

struct X
{
        int a;
        int b;
};

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

Now assume this code is put in a shared library, which is used by third-party applications.

My question is: if I add another member at the end of X (eg int c ), and initialize it in foobar() , will existing applications which call foobar() break? Note that this is about binary compatibility, not source compatibility.

It depends entirely on what your compiler chooses to do (more specifically, what the platform ABI dictates).

You can imagine that if the return value is placed on the stack, you would now be writing more onto the stack than the caller is expecting, which may result in stamping on something.

In general, you shouldn't rely on any particular behaviour. You simply must re-compile the client applications. The only realistic alternative is something like the PIMPL idiom .

Since the size of X would change, yes. Arrays and such depend on sizes. You might get "lucky" and padding might allow older apps to use the newer lib but it would be pure luck.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM