班级大小因模块 (DLL) 而异.如何以及为什么?
Class size is different across modules (DLLs). How and why?
我有两个Visual Studio 2015 C++项目,分别是A
和B
。A
被编译为共享库,B
使用它。它们都使用A
中定义的类Foo
。
问题出现在B
中的一行,如下所示:
auto p = std::make_shared<Foo>(3);
养AccessViolationException
.
我意识到A
和B
对Foo
大小的识别方式不同,它使Foo
的构造函数B
越过A
的make_shared
分配的内存边界。使用 Visual Studio 的"监视"窗口,我可以看到当代码在模块中运行时sizeof(Foo)
A
为 1832,而当代码在模块中运行时,相同的监视条目给出的值为 1813B
。
我试图删除两个项目的所有中间文件和输出文件并重建整个解决方案,但从未提供帮助。
那么,单个类如何在不同的模块中以不同的大小出现呢?什么决定了类的内存布局?最后也是最重要的,我该如何解决问题?
除非满足以下条件之一,否则您不能从纯粹主义的角度推理对象大小(或布局(:
类型是标准布局类型。
或
关于构建的所有内容都是恒定的 - 特别是编译器标志、使用的编译器、编译器版本等。
最后也是最重要的,我该如何解决问题?
基本上你有2个选择。
使用标准布局类型或确保其构建方式相同。出于这个原因,大多数公开可用的DLL或共享库接口在其接口中不使用高级类型(即非标准布局(,有些甚至保留与c兼容的代码(有时实际上与c兼容(。
相关文章:
- C++ 代码的行为因编译器而异
- 随机数生成器的性能因平台而异
- 班级大小因模块 (DLL) 而异.如何以及为什么?
- 虚拟指针大小因类数据成员而异
- 包含标头中的搜索路径因编译器而异
- 为什么汇编代码因我使用的反汇编程序而异
- 以下代码的输出是什么(答案因差异编译器而异)
- 引用基类的 constexpr 构造函数因编译器而异
- 分段故障位置因 printf 而异
- 重新解释的值因编译器而异
- sizeof(std::list<T>) 可以因不同类型的 T 而异吗?
- 如何引用要以C++打开的文件,因为其完整路径名将因计算机而异
- C++ 静态成员函数错误 C2556 重载函数仅因返回类型而异
- 强制转换函数指针,该指针因参数类型而异
- 未使用的变量警告因自动变量而异
- UDP数据包丢失因数据包大小而异
- 浮点常量值因C++声明方式而异(Xcode IDE)
- 模板方法,其参数数量为实例化固定,但因模板参数而异
- 一元:为什么一元在 c# 中的行为因 c/c++ 而异
- 为什么预定义流对象的大小因编译器而异