当涉及填充和继承时,我对gcc和clang如何布局结构感到困惑.这是一个示例程序:
#include <string.h>
#include <stdio.h>
struct A
{
void* m_a;
};
struct B: A
{
void* m_b1;
char m_b2;
};
struct B2
{
void* m_a;
void* m_b1;
char m_b2;
};
struct C: B
{
short m_c;
};
struct C2: B2
{
short m_c;
};
int main ()
{
C c;
memset (&c, 0, sizeof (C));
memset ((B*) &c, -1, sizeof (B));
printf (
"c.m_c = %d; sizeof (A) = %d sizeof (B) = %d sizeof (C) = %d\n",
c.m_c, sizeof …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(app)和一个动态库/共享对象(dlib),两者都链接到一个静态库,该库使用__declspec (selectany)/在头文件中声明一个全局变量(gvar)__attribute__ ((weak))。按照设计,app 和 dlib 都应该有自己的 gvar 副本(在 MSVC 和 GCC 上我完全明白)。
移植到 Mac OSX 并使用 clang 编译后,我看到 dlib 中的 gvar 链接到 app 中的 gvar。不确定这是一个叮当声错误还是设计使然;如果是设计使然,有没有办法避免它并获得与 GCC/MSVC 相同的行为?
叮当版:
bash-3.2$ c++ --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
重现问题的最小项目:
主.cpp:
#include <stdio.h>
#include <dlfcn.h>
__attribute__ ((weak)) int g_global = 10;
int main ()
{
printf ("main (): g_global: addr = %p; value = %d\n", &g_global, g_global);
typedef void Foo ();
void* so = …Run Code Online (Sandbox Code Playgroud)