小编use*_*059的帖子

gcc/clang在基础结构的后填充中布局派生结构的字段

当涉及填充和继承时,我对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)

c++ gcc padding clang

7
推荐指数
2
解决办法
437
查看次数

__attribute__ ((weak)) 在 clang 和 gcc 中的处理不同

我有一个应用程序(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)

c++ macos gcc clang

5
推荐指数
1
解决办法
1875
查看次数

标签 统计

c++ ×2

clang ×2

gcc ×2

macos ×1

padding ×1