visualstudioc++中的填充错误



我第一次在Visual studio上运行代码。在弹出的数百条警告中,有两条被视为错误,及时指出了一些问题

第一个警告是

Warning    C4820   '_timespec64': '4' bytes padding added after data member '_timespec64::tv_nsec' 

其在时间上指向以下代码。h

struct _timespec64
{
__time64_t tv_sec;
long       tv_nsec;
};

第二个警告是

Warning    C4820   'timespec': '4' bytes padding added after data member 'timespec::tv_nsec'   

其指向以下时间部分。h

#ifndef _CRT_NO_TIME_T
struct timespec
{
time_t tv_sec;  // Seconds - >= 0
long   tv_nsec; // Nanoseconds - [0, 999999999]
};
#endif

这个填充指的是什么?如何解决这个问题?

当你定义这样的结构学生时,

{  
char a; // 1 byte  
char b; // 1 byte  
int c;  // 4 bytes   
}  

你期待这样的记忆安排。

... [a] [b] [c] [c] [c] [c] [ ] [ ] ...

当我们考虑32位体系结构时,可以一次访问4字节。问题是,在一个CPU周期内,可以访问一个字节的char a、一个字节b和2个字节的int c。在访问char a和char b时,我们不会遇到任何问题,因为这两个变量都可以在一个CPU周期内访问,但当我们访问int c变量时,我们会遇到问题,因为访问"c"变量的值需要两个CPU周期。在第一个CPU周期中,前两个字节被访问,而在第二个周期中,其他两个字节则被访问。

假设我们不想访问"a"one_answers"b"变量,我们只想访问变量"c",这需要两个循环。变量"c"为4个字节,因此也可以在一个周期内访问,但在这种情况下,它使用2个周期。这是不必要的CPU周期浪费。由于这个原因,引入了结构填充的概念来节省CPU周期的数量。结构填充是由编译器自动完成的。现在,我们将看到结构填充是如何完成的。

... [a] [b] [ ] [ ] [c] [c] [c] [c] ...

为了实现结构填充,如上图所示,在左侧创建一个空行,并将左侧"c"变量占用的两个字节向右移动。因此,"c"变量的所有四个字节都在右边。现在,"c"变量可以在一个CPU周期内访问。结构填充后,该结构占用的总内存为8个字节(1个字节+1个字节+2个字节+4个字节(,比前一个大。尽管在这种情况下会浪费内存,但可以在单个周期内访问变量。


我假设系统中长类型的大小为4字节,时间类型的大小是8字节。在这种情况下,内存分配将如下所示。

... [t] [t] [t] [t] [t] [t] [t] [t] [l] [l] [l] [l] [ ] [ ] [ ] [ ] ...
[---------------- structure type memory area ---------------- ]

您可以检查它sizeof(_timespec64)。然后它将返回16。


为了避免这种情况,您必须更改您的visual studio偏好。

Project right click
-> Property
-> Project settings
-> Configuration Properties
-> c/c++ general
-> Treat warnings as errors

最新更新