为C结构分配更多空间以提高性能?
我正在做一些需要我创建一个类似于为C结构分配更多空间以提高性能?,c,optimization,memory-management,C,Optimization,Memory Management,我正在做一些需要我创建一个类似于 typedef struct vector { int dimension; double* data; } Vctr; 我认为,如果我可以将数据存储在与分配向量相同的区域中,那么访问成员元素data可能会更快,因此我决定尝试一下 // replaces vector->data[i] #define data(name, x) *( ( double* )name + sizeof( int ) + sizeof( double ) )
typedef struct vector {
int dimension;
double* data;
} Vctr;
我认为,如果我可以将数据存储在与分配向量相同的区域中,那么访问成员元素data可能会更快,因此我决定尝试一下
// replaces vector->data[i]
#define data(name, x) *( ( double* )name + sizeof( int ) + sizeof( double ) )
typedef struct vector {
int dim;
double* data;
} Vctr;
Vctr* vMake( double* data, int dim )
{
assert( dim > 0 );
// Allocating enough space for vector and the data member
Vctr* retVal = malloc( sizeof( Vctr ) + (size_t)(dim - 1) * sizeof( double ) );
retVal->dim = dim;
// copy data into the vector
while( dim ) data( retVal, --dim ) = data[dim];
return retVal;
}
我编写了宏数据(name,x),希望它也可以进一步改进基于函数vMake的功能
这对提高数据处理繁重的程序的性能有任何作用吗 这似乎是船长的完美工作!用野生指针射击大象通常是个坏主意。(又称未定义行为)单独使用数组或灵活的数组成员。请注意:对于函数、函数参数和结构字段,使用相同的名称(
data
)非常容易混淆。FAM将避免指针取消引用和通常的缓存未命中(这可能是巨大的),试图仅通过计算的地址访问对象,如double
,是生成SIGBUS
信号和/或损害性能的好方法。许多体系结构都有特定的地址对齐限制,即使对于那些没有地址对齐限制的体系结构,也可能存在基于对象对齐的显著性能差异。如果您担心性能,只需提高编译器的优化级别。编写通用代码的速度不太可能快于编译器生成的速度,而且编译器会知道对齐限制。