каковы цель и тип возврата __ builtin_offsetof оператор?

Если вы уверены, что ваша функция будет работать не более 15 минут, AWS Lambda может стать решением. Вот лямбда-ограничения AWS , которые могут помочь вам принять решение по этому вопросу.

Также обратите внимание, что лямбда имеет холодный старт, это когда она сначала будет работать медленнее, но со временем наберет темп. Вот некоторые хорошие отзывы об этом, которые могут помочь вам определиться с лямбда-направлением, но не стесняйтесь проверять любые статьи, которые могли бы лучше объяснить в вашем распоряжении.

  • Этот показывает краткие списки, которые вы хотели бы рассмотреть, и факторы, влияющие на него.
  • Этот может иметь более глубокое объяснение холодного старта в отношении того, как он работает внутри.

Что мне следует использовать, если моя работа должна работать дольше?

blockquote>

В зависимости от вашей инфраструктуры, вы можете изучить Запланированные задачи [119 ]

7
задан Dynite 30 December 2008 в 12:04
поделиться

4 ответа

Это - встроенное, обеспеченное компилятором GCC для реализации offsetof макрос, который указан Стандартом C++ и C:

GCC - offsetof

Это возвращает смещение в байтах, в которых член структуры/объединения POD.

Образец:

struct abc1 { int a, b, c; };
union abc2 { int a, b, c; };
struct abc3 { abc3() { } int a, b, c; }; // non-POD
union abc4 { abc4() { } int a, b, c; };  // non-POD

assert(offsetof(abc1, a) == 0); // always, because there's no padding before a.
assert(offsetof(abc1, b) == 4); // here, on my system
assert(offsetof(abc2, a) == offsetof(abc2, b)); // (members overlap)
assert(offsetof(abc3, c) == 8); // undefined behavior. GCC outputs warnings
assert(offsetof(abc4, a) == 0); // undefined behavior. GCC outputs warnings

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

8
ответ дан 6 December 2019 в 06:04
поделиться

Как @litb указывает и шоу @JesperE, offsetof () обеспечивает целочисленное смещение в байтах (как a size_t значение).

Когда Вы могли бы использовать его?

Один случай, где это могло бы быть релевантно, является табличной операцией для чтения огромного количества разнообразных параметров конфигурации из файла и наполнения значений в одинаково огромную структуру данных. Уменьшая огромный вниз до ТАК тривиального (и игнорирование большого разнообразия необходимых реальных методов, таких как определение структуры вводит в заголовках), я подразумеваю, что некоторые параметры могли быть целыми числами и строками других, и код мог бы посмотреть слабо как:

#include <stddef.h>

typedef stuct config_info config_info;
struct config_info
{
   int parameter1;
   int parameter2;
   int parameter3;
   char *string1;
   char *string2;
   char *string3;
   int parameter4;
} main_configuration;

typedef struct config_desc config_desc;
static const struct config_desc
{
   char *name;
   enum paramtype { PT_INT, PT_STR } type;
   size_t offset;
   int   min_val;
   int   max_val;
   int   max_len;
} desc_configuration[] =
{
    { "GIZMOTRON_RATING", PT_INT, offsetof(config_info, parameter1), 0, 100, 0 },
    { "NECROSIS_FACTOR",  PT_INT, offsetof(config_info, parameter2), -20, +20, 0 },
    { "GILLYWEED_LEAVES", PT_INT, offsetof(config_info, parameter3), 1, 3, 0 },
    { "INFLATION_FACTOR", PT_INT, offsetof(config_info, parameter4), 1000, 10000, 0 },
    { "EXTRA_CONFIG",     PT_STR, offsetof(config_info, string1), 0, 0, 64 },
    { "USER_NAME",        PT_STR, offsetof(config_info, string2), 0, 0, 16 },
    { "GIZMOTRON_LABEL",  PT_STR, offsetof(config_info, string3), 0, 0, 32 },
};

Можно теперь записать общую функцию, которая читает строки из файла конфигурации, отбрасывая комментарии и пустые строки. Это затем изолирует название параметра и ищет это в desc_configuration таблица (который Вы могли бы отсортировать так, чтобы можно было сделать двоичный поиск - несколько ТАК адрес вопросов это). Когда это находит корректное config_desc запись, это может передать значение, которое это нашло и config_desc запись в одну из двух стандартных программ - один для обработки строк, другого для обработки целых чисел.

Ключевая роль тех функций:

static int validate_set_int_config(const config_desc *desc, char *value)
{
    int *data = (int *)((char *)&main_configuration + desc->offset);
    ...
    *data = atoi(value);
    ...
}

static int validate_set_str_config(const config_desc *desc, char *value)
{
    char **data = (char **)((char *)&main_configuration + desc->offset);
    ...
    *data = strdup(value);
    ...
}

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

13
ответ дан 6 December 2019 в 06:04
поделиться

Цель встроенного __ offsetof оператор состоит в том, что поставщик компилятора может продолжить к #define offsetof () макрос, все же иметь его работа с классами, которые определяют унарный operator&. Типичное макроопределение C offsetof () только работало, когда (&lvalue) возвратил адрес этого rvalue. Т.е.

#define offsetof(type, member) (int)(&((type *)0)->member) // C definition, not C++
struct CFoo {
    struct Evil {
        int operator&() { return 42; }
    };
    Evil foo;
};
ptrdiff_t t = offsetof(CFoo, foo); // Would call Evil::operator& and return 42
7
ответ дан 6 December 2019 в 06:04
поделиться

Как @litb, сказал: смещение в байтах участника структуры/класса. В C++ существуют случаи, где это не определено, в случае, если компилятор будет жаловаться. IIRC, один способ реализовать его (в C, по крайней мере) должен сделать

#define offsetof(type, member) (int)(&((type *)0)->member)

Но я уверен, что существуют проблемы это, но я оставлю это заинтересованному читателю для указания...

2
ответ дан 6 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: