Какой из двух способов инициализировать структуру в куче лучше - PullRequest
1 голос
/ 14 апреля 2020

Я думал об этой проблеме, когда я изучал C, я думал о двух способах инициализации структуры в куче.

typedef struct Point {
    int x;
    int y;
    int z;
} Point;

Point *test1(int x, int y, int z) {
    Point *point = (Point *) malloc(sizeof(Point));
    point->x = x;
    point->y = y;
    point->z = z;
    return point;
}

Point *test2(int x, int y, int z) {
    Point *point = (Point *) malloc(sizeof(Point));
    *point = (Point) {x, y, z};
    return point;
}

Запись в test1 - это то, что я обычно использую, но запись в test2 кажется более удобной. Но test2 создаст дополнительные объекты? Хотя структура здесь состоит только из 3 членов, повлияет ли количество членов на заключение?

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Компиляторы оптимизируют обе функции для идентичного кода. Убедитесь сами на Годболте

Это микрооптимизации. Если вы заботитесь о производительности, то в первую очередь оцениваете и определяете профиль, а затем оптимизируете горячие точки.

0 голосов
/ 15 апреля 2020

Есть и другие способы сделать это, например, инициализация в стиле C99:

Point *test3( int x, int y, int z ) {
    Point * const point = (Point *) malloc(sizeof(Point));
    if (point) { // Don't write through a NULL pointer!
      *point = { .x = x,
                 .y = y,
                 .z = z };
    }
    return point;
}

Преимущество этого в том, что он все равно будет работать, если члены Point переставлены и расширены. Это также полезно для записи stati c отдельных назначений.

Я также предпочитаю calloc() установить все неинициализированные биты структуры в ноль. Это, вероятно, не имеет значения, но если это произойдет, это действительно раздражает Гейзенбаг, чтобы выследить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...