系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.
我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?
我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).
对齐对C++ 11的性能是否真的重要?
在Stroustrup的书中有一条建议,要求从最大到最小的结构中对成员进行排序.但我想知道是否有人进行了测量,以确定是否会产生任何影响,并且在编写代码时是否值得考虑.
这样做是否有副作用:
C代码:
struct foo {
int k;
};
int ret_foo(const struct foo* f){
return f.k;
}
Run Code Online (Sandbox Code Playgroud)
C++代码:
class bar : public foo {
int my_bar() {
return ret_foo( (foo)this );
}
};
Run Code Online (Sandbox Code Playgroud)
这里有一个extern "C"围绕着C++代码,并且每个代码本身编译单元内.
这可以跨编译器移植吗?
较旧的K&R(第二版)和其他我读过的C语言文本讨论了动态内存分配器的实现方式,malloc()并且free()通常还提及有关数据类型对齐限制的内容.显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和处理某些值类型.例如,可能要求long必须从4的倍数地址开始存储4字节()整数.
主要平台(英特尔和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是可以安全地忽略在特定地址边界上对齐内存分配?
struct Dummy {
int x;
char y;
};
int main() {
struct Dummy dum;
dum.x = 10;
dum.y = 'a';
}
Run Code Online (Sandbox Code Playgroud)
如何在小端机器上布置结构构件?
它会是这样的吗?
0x1000 +0 +1 +2 +3
___________________
x: | 10 | 0 | 0 | 0 |
-------------------
y: | 'a'| 0 | 0 | 0 |
-------------------
0x1000 +4 +5 +6 +7
Run Code Online (Sandbox Code Playgroud) 我有类似的情况
struct Child
{
u16 x, y;
// other fields
};
struct Father
{
struct Child child1;
struct Child child2;
// other fields
};
Father tilemap[WIDTH][HEIGHT];
Run Code Online (Sandbox Code Playgroud)
现在我才意识到我想为 x,y 保存四个字节,对于同一个父亲的两个孩子,这些字节总是设置为相同的值。
在我的代码周围Father*,我传递了很多很多,Child*同时分别使用father->child1->x或恢复坐标child1->x。我想安全地在Father水平上移动坐标,但我不确定一些事实。
与 gcc/g++ 的任何优化或可能实现相比,是否会遵守声明字段的顺序?我能有信心&father == &father.child1吗?
这里真正的问题是我在Child*不知道它是 child1 还是 child2 字段的情况下通过,所以我不能直接知道偏移量来恢复父亲的地址(以及坐标)。我想在Child级别上使用一点来区分它们,但会那么我可以轻松地恢复父亲的地址吗?
任何建议将不胜感激,谢谢
编辑:作为进一步的信息,我使用 C++ 作为我的主要语言,但这些结构不包含任何奇怪的方法,只有字段和空的构造函数。
我不明白如何重新分配结构的内存允许我在我的结构中插入一个更大的char数组.
结构定义:
typedef struct props
{
char northTexture[1];
char southTexture[1];
char eastTexture[1];
char westTexture[1];
char floorTexture[1];
char ceilingTexture[1];
} PROPDATA;
Run Code Online (Sandbox Code Playgroud)
例:
void function SetNorthTexture( PROPDATA* propData, char* northTexture )
{
if( strlen( northTexture ) != strlen( propData->northTexture ) )
{
PROPDATA* propPtr = (PROPDATA*)realloc( propData, sizeof( PROPDATA ) +
sizeof( northTexture ) );
if( propPtr != NULL )
{
strcpy( propData->northTexture, northTexture );
}
}
else
{
strcpy( propData->northTexture, northTexture );
}
}
Run Code Online (Sandbox Code Playgroud)
我测试了类似于此的东西,它似乎工作,我只是不明白它是如何工作的.现在我希望有些人会想"只是使用一个字母*",但我不能出于任何原因.字符串必须存储在结构本身中.
我的困惑来自于我没有为任何特定目的重新调整我的结构.我没有以某种方式表明我希望在该示例中将额外空间分配给北纹理char数组.我想我分配的额外内存用于实际存储字符串,不知怎的,当我调用strcpy时,它意识到没有足够的空间......
关于它如何工作(或者甚至是如何有缺陷的)的任何解释都会很棒.