以下代码是多线程的,并且正在为线程id = 0和1 同时运行。
typedef struct
{
unsigned char pixels[4];
} FourPixels;
main()
{
FourPixels spixels[];
//copy on spixels
spixels[id] = gpixels[id];
//example : remove blue component
spixels[id].pixels[0] &= 0xFC;
spixels[id].pixels[1] &= 0xFC;
spixels[id].pixels[2] &= 0xFC;
spixels[id].pixels[3] &= 0xFC;
}
我们看到线程id = 0获取4个字符,而线程id = 1获取另一组4个字符。
我想在内存中知道结构spixels [0]和spixles [1]是如何放置的,意思是这样的?
spixels[0] spixels[1]
pixel[0] pixel[1] pixel[2] pixel[3] pixel[0] pixel[1] pixel[2] pixel[3]
2000 2001 2002 2003 2004 2005 2006 2007
问题是spixel [0]和spixel [1]是否与上面所示的保证相邻?
答案 0 :(得分:1)
是的,正如你所说,它们会被连续布局。现在,可能有人会说在所有平台上都没有保证,因为结构的对齐可能超过它的大小,所以你可能在两个结构“主体”之间有一个间隙,因为在第一个之后隐式填充一。但无论如何,因为任何理智的编译器和平台上的对齐将只有1个字节(如在char中)。
如果我正在编写依赖于此的代码,我会添加一个编译时断言,其中两个结构的大小应该恰好是8个字节,然后我会100%自信。
编辑:这是编译时检查可能如何工作的示例:
struct check {
char floor[sizeof(FourPixels[2]) - 8];
char ceiling[8 - sizeof(FourPixels[2])];
};
这个想法是,如果大小不是8,其中一个数组将具有负大小。如果它是8,它们都将是零大小。请注意,这是一个编译器扩展(例如GCC支持零长度数组),因此您可能希望寻找更好的方法。我更像是一个C ++人,我们有更好的技巧(在C ++ 11中内置:static_assert()
)。
答案 1 :(得分:0)
标准保证数组是连续的。它还保证第一个条目将在内存中的低地址上,而下一个条目将在更高的等等上。
如果结构pixel
数组,pixel[1]
将始终直接 pixel[0]
之后。与下一个条目相同。
答案 2 :(得分:0)
是数组放在连续的内存位置。 这是为了允许指针算术。