热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

这些结构的大小在文件中是不同的,但在程序存储器中是相同的

如何解决《这些结构的大小在文件中是不同的,但在程序存储器中是相同的》经验,为你挑选了1个好方法。

考虑以下POD结构:

struct MessageWithArray {
    uint32_t raw;
    uint32_t myArray[10];

    //MessageWithArray() : raw(0), myArray{ 10,20,30,40,50,60,70,80,90,100 } {  };
};

运行以下内容:

#include 
#include 
#include 
#include 

struct MessageWithArray {
    uint32_t raw;
    uint32_t myArray[10];

    //MessageWithArray() : raw(0), myArray{ 10,20,30,40,50,60,70,80,90,100 } {  };
};

///sf/ask/17360801/
template 
char* as_bytes(T& x) {
    return &reinterpret_cast(x);
    // or:
    // return reinterpret_cast(std::addressof(x));
}

int main() {
    MessageWithArray msg = { 0, {0,1,2,3,4,5,6,7,8,9} };
    std::cout <<"Size of MessageWithArray struct: " <() <

给出以下输出:

MessageWithArray结构的大小:44

是POD吗?1

"message.txt"文件的十六进制转储如下所示:

00  00  00  00  00  00  00  00  01  00  00  00  02  00  00  00
03  00  00  00  04  00  00  00  05  00  00  00  06  00  00  00
07  00  00  00  08  00  00  00  09  00  00  00

现在,如果我取消注释构造函数(因此它MessageWithArray具有零参数构造函数),则MessageWithArray变为非POD结构.然后我使用构造函数来初始化.这导致代码中的以下更改:

....
struct MessageWithArray {
    .....

    MessageWithArray() : raw(0), myArray{ 10,20,30,40,50,60,70,80,90,100 }{  };
};
....
int main(){
    MessageWithArray msg;
    ....
}

运行此代码,我得到:

MessageWithArray结构的大小:44

是POD吗?0

"message.txt"文件的十六进制转储如下所示:

00  00  00  00  0D  0A  00  00  00  14  00  00  00  1E  00  00
00  28  00  00  00  32  00  00  00  3C  00  00  00  46  00  00
00  50  00  00  00  5A  00  00  00  64  00  00  00

现在,我对实际的十六进制值不太感兴趣,我很好奇的是为什么在非POD结构转储中与POD结构转储相比还有一个字节,当sizeof()声明它们是相同的字节数?是否有可能因为构造函数使结构非POD,隐藏的东西已被添加到结构中?sizeof()应该是一个准确的编译时检查,对吗?有可能避免被sizeof()测量吗?

规格:我在Windows 10计算机上的Visual Studio 2017版本15.7.5,Microsoft Visual C++ 2017中的空项目中运行它.

英特尔酷睿i7-4600M CPU 64位操作系统,基于x64的处理器

编辑:我决定初始化结构以避免未定义的行为,因为该问题仍然有效初始化.将其初始化为不带10的值会保留我最初观察到的行为,因为数组从未包含任何10的数据(即使它是垃圾,也是随机的).



1> HolyBlackCat..:

它与POD-ness无关.

ofstream以文本模式(而不是二进制模式)打开.在Windows上它意味着\n转换为\r\n.

在第二种情况下,结构中恰好有一个0x0A(\n)字节,变为0x0D 0x0A(\r\n).这就是你看到一个额外字节的原因.


此外,在第一种情况下使用未初始化的变量会导致未定义的行为,这种情况本身并未表现出来.


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
author-avatar
海木木
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有