c - 连续多次调用 sizeof()

标签 c gcc memory-management

我有一个看起来像这样的结构:

struct dgm_network_pkt {
    char    responder[INET_ADDRSTRLEN];
    int     num;
    char    **neighbors;
};

字段num跟踪 neighbors 已分配和指向的字符数组数量.

现在我想构造一个包含 header 然后是结构的数据包,并发送一个包含此数据包的 UDP 数据包。为了实现这一点,我需要做大量的指针运算,并多次调用 sizeof()。例如,如果我的 header 是 enum header hdr; ,我的缓冲区是 char *buf;我的结构实例是 struct mystruct stc; ,我需要执行以下操作(片段):

buf = malloc(sizeof(stc.num * SIZEOF_EACH_ARRAY) + sizeof(hdr) + sizeof(stc.responder) + sizeof(int));

memcpy(buf, &hdr, sizeof(hdr)); /* Copy over header */
memcpy(buf + sizeof(hdr), &stc.responder, sizeof(stc.responder)); /* Copy 'responder' field */
memcpy(buf + dizeof(hdr) + sizeof(stc.responder), &stc.num, sizeof(int)); /* Copy num field */

然后循环复制neighbors指向的字符数组再次调用sizeof()多次使用相同的参数。

如果你想看,这里是我用来完成所有这些的功能以供引用,但它没有必要回答我的问题,并且可能会增加困惑(增加间接)。

int dismesh_compose_net_pkt(struct dgm_network_pkt *dismesh_sta, char **buf)
{
    int i;
    int pkt_size;
    enum dgm_header dgm_hdr;

    pkt_size = dismesh_sta->num * DISMESH_ETH_ADDR_STR + sizeof(dgm_hdr) 
        + sizeof(dismesh_sta->responder) + sizeof(int);

    dgm_hdr = NETWORK_STATUS_RESP;
    if ((*buf = malloc(pkt_size)) == NULL)
        return -1; 

    memcpy(*buf, &dgm_hdr, sizeof(dgm_hdr));
    memcpy(*buf + sizeof(dgm_hdr), &dismesh_sta->responder, sizeof(dismesh_sta->responder));
    memcpy(*buf + sizeof(dgm_hdr) + sizeof(dismesh_sta->responder), &dismesh_sta->num, sizeof(int));

    /* Copy contents of neighbors to buffer */
    for (i = 0; i < dismesh_sta->num; i++) {
        memcpy(*buf + sizeof(dgm_hdr) + sizeof(dismesh_sta->responder) + sizeof(int) + i * DISMESH_ETH_ADDR_STR,
                *(dismesh_sta->neighbors + i), DISMESH_ETH_ADDR_STR);
        DGM_LOG("Packed up neighbor %d\n", i); 
    }   

    return pkt_size;
}

这里是:

我注意到我经常调用 sizeof()一遍又一遍地使用相同的参数:将结构的内容复制到缓冲区,每个元素的大小等等。有没有更好的方法来做到这一点?我在想我可以在我的头文件中有一些#defines,比如说,我可以做 #define OFFSET_RESPONDER sizeof(hdr) , #define OFFSET_NUM OFFSET_RESPONDER + sizeof(mystruct.responder) , 和 #define SIZE_HEADER sizeof(dgm_header)等。如果保持原样,我会注意到性能显着下降吗?编译器(在我的例子中是 GCC)是否对此进行了优化?您认为#defines 会降低可读性吗?清理此代码的最佳方法是什么?

最佳答案

首先,sizeof 是一个运算符,而不是一个函数,因此编译器会将其转换为一个数字。

其次,看一下offsetof宏观;我认为它会完全满足您的需求。

关于c - 连续多次调用 sizeof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372262/

相关文章:

c - 访问冲突写入位置 c ,二维动态数组

c - 我什么时候应该释放 C 循环中使用的内存?

ios - 使用 Storyboard实例化的 Controller 的重新分配

c++ - 使用不同的编译器 (C++) 生成的二进制文件速度差异太大

python - 为在 AWS Lambda 中使用的 python 包指定 C(++) 依赖项

c++ - thread_local std::list 是否在调用 clear 时放弃分配的内存?

c - insmod:错误:无法插入模块 kprobe_example.ko:不允许操作

C 数组 : showing big numbers as the output when its index goes out of bound

c - 在 SDL 中,如果我重新渲染文本,是否需要释放表面?

用 GCC 编译 C 文件会产生错误?