为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
信号和/或损害性能的好方法。许多体系结构都有特定的地址对齐限制,即使对于那些没有地址对齐限制的体系结构,也可能存在基于对象对齐的显著性能差异。如果您担心性能,只需提高编译器的优化级别。编写通用代码的速度不太可能快于编译器生成的速度,而且编译器会知道对齐限制。