我第一次在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