指向成员函数的指针的大小疯狂变化

2024-05-09

有一个非常微妙的问题。 得到一个用 MS VS 2013 c++ 编译器编译的类,对于 32 位平台,大小为 4 个字节。函数指针的大小为 4 个字节。但是,当这个类使用相同的编译器编译但包含到不同的项目中以生成库时,也针对 32 位平台,则该类的 *m_Function 指针占用 16 个字节!当然,当我从主项目实例化此类时,它认为该类占用 4 个字节并分配这个内存大小,而实际上它占用 16 个字节并导致内存溢出。

 class CC1
    {
    public:
        CC1();

        void (CC1:: *m_Function) ();
    };

我知道指向成员函数的指针的大小可能会有所不同。但问题是 - 哪个编译器设置控制这个?我不在乎它是 4 个字节还是 16 个字节 - 只需要它们相同即可。两个项目的结构成员对齐设置相同。 /vmm /vmg 选项?这两个项目的编译器设置中都没有提及它们。

顺便说一句,我尝试构建 x64 目标,在这种情况下, sizeof *m_Function 始终是来自 main 和 libray 项目的 8 个字节。

谢谢。


请参阅此处了解 /vm 选项的文档页面 https://msdn.microsoft.com/en-us/library/yad46a6z.aspx

如果您使用“/vmg”编译器选项,则指向成员函数的指针将始终为 16 个字节,因为您有效地告诉编译器它可能事先不知道大小,因此必须假设最坏的情况(虚拟继承!) 。

如果您使用“/vmb”,那么编译器必须在使用之前了解该结构的继承模式,因此可以使用最有效的方法 - 在简单继承的情况下,这是 4 个字节。

很可能在某些项目中您设置了“/vmg”(这使得类为 16 字节),而在其他项目中您没有设置(这使得类为 4 字节)。

/vmb 是隐式默认值 - 检查编译器命令行中的库,其中该类的 /vmg 为 16 字节

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指向成员函数的指针的大小疯狂变化 的相关文章

随机推荐

  • 批处理 - 默认浏览器?

    有没有办法使用批处理文件查找我的计算机上的默认浏览器 只需使用 启动 www google com See here http social msdn microsoft com Forums is iewebdevelopment thr
  • 从重定向到日志文件的程序输出中删除进度条

    我正在运行一个程序 它会输出进度条 我是这样做的 python train py tee train log The train log看起来像下面这样 这是1号线 Training 这是2号线 000 valid 100 2630 263
  • 错误:子进程失败,退出,错误号 48

    错误 48 对我来说是一个新错误 我在尝试输入 mongo 时也遇到错误 Error network error while attempting to run command isMaster on host 127 0 0 1 2701
  • 社交对象 - 数据库结构、过滤、排序、可扩展性的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在 ASP NET MVC 中构建通用企业社交网络平台 任何社交网站的主要特征之一是社会对象由用户显式 文本更新 照片 博客 视频等 或隐
  • 调用不通过空指针访问成员的非静态方法是否合法/定义良好的 C++?

    我最近遇到了以下代码 class Foo public void bar other stuff void Foo bar if this do some stuff without accessing any data members r
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 比较两个constexpr指针不是constexpr吗?

    我正在寻找一种在编译时将类型映射到数值的方法 理想情况下不使用中建议的哈希this https stackoverflow com a 36122101 2173029 answer 由于指针可以是constexpr 我尝试过这个 stru
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 将非平凡函数应用于 data.table 的有序子集

    Problem 我正在尝试使用我新发现的 data table 功能 永久 来计算一堆数据的频率内容 如下所示 Sample Channel Trial Voltage Class Subject 1 1 1 196 82253 1 1 1
  • 使用 RewriteRule 从重定向中删除主题标签

    我目前正在通过获取变量并将其插入新 URL 来重定向 URL 就像这样 RewriteCond QUERY STRING pid 0 9 RewriteRule vault displayimage php photos 1 R 301 L
  • 我们可以同时使用拼音标记和同义词吗?

    我正在尝试同时启用语音分析器和同义词 这似乎不起作用 它们一起使用有错吗 在下面的实现中 我希望使用同义词转换搜索查询 然后使用语音分析器来检索结果 但我的同义词在这里完全被忽略了 如果我在创建索引时删除语音分析器 那么同义词就可以正常工作
  • 从 CosmosDB 文档嵌套数组中的对象中选择值

    想象一下我们有一个这样的集合 示例取自https www documentdb com sql demo https www documentdb com sql demo id 19015 description Snacks grano
  • 避免嵌套 for 循环

    我正在尝试使用六个不同参数的所有可能的值组合来重复测试其他一些 Python 代码 对于每个参数 我想迭代具有给定最小值 最大值和步长的一系列值 我设法编写了一些代码 例如 for var1 in range min1 max1 step1
  • 如何取消/关闭 Angular 中的行为主体

    我有一个订阅了行为主题的组件ngOnInit生命周期 该组件 html 使用ngIf在渲染表格之前查看数据是否存在 当我离开该页面时 我想确保下次返回时 该表不可见 直到再次获取该数据 到目前为止 我能够做到这一点的唯一方法是调用该主题的
  • 按一定条件查找数组内元素的最后一个索引

    假设我有一个对象数组 a something b 12 a something b 12 a somethingElse b 12 a something b 12 a somethingElse b 12 获取元素的最后一个索引的最干净的
  • 添加类/删除类问题

    单击 A 类按钮时 将 A 类替换为 B 类 单击 B 类按钮时 我需要执行一个操作 它正确地应用 删除了该类 但由于某种原因它不会选择 B 类 changebut click function input type text fadeOu
  • 如何使用 rustls 库建立 TLS 连接?

    The 文档 https docs rs rustls 0 10 0 rustls 提供了一个例子 不幸的是它不能编译 很多东西都被重命名了 界面也被重命名了ClientSession构造函数改变了 我设法将错误修复到可以编译的程度 但没有
  • Azure AD B2C - 具有 HRD、域提示和 MFA 的自定义策略

    我正在尝试构建一个利用主域发现和域提示的 B2C 自定义策略 我们有 2 个角色 使用 MFA 在 B2C 中进行身份验证的本地用户 必须重定向到其公司的登录页面的外部用户 用例 用户被重定向到https customdomain b2cl
  • React:未终止的 JSX 内容

    为什么我会收到错误消息Unterminated JSX contents为闭幕式div 元素 我究竟做错了什么 export default class Search extends Component render return div
  • 指向成员函数的指针的大小疯狂变化

    有一个非常微妙的问题 得到一个用 MS VS 2013 c 编译器编译的类 对于 32 位平台 大小为 4 个字节 函数指针的大小为 4 个字节 但是 当这个类使用相同的编译器编译但包含到不同的项目中以生成库时 也针对 32 位平台 则该类