Если вы уверены, что ваша функция будет работать не более 15 минут, AWS Lambda может стать решением. Вот лямбда-ограничения AWS , которые могут помочь вам принять решение по этому вопросу.
Также обратите внимание, что лямбда имеет холодный старт, это когда она сначала будет работать медленнее, но со временем наберет темп. Вот некоторые хорошие отзывы об этом, которые могут помочь вам определиться с лямбда-направлением, но не стесняйтесь проверять любые статьи, которые могли бы лучше объяснить в вашем распоряжении.
Что мне следует использовать, если моя работа должна работать дольше?
blockquote>В зависимости от вашей инфраструктуры, вы можете изучить Запланированные задачи [119 ]
Это - встроенное, обеспеченное компилятором GCC для реализации offsetof
макрос, который указан Стандартом C++ и C:
Это возвращает смещение в байтах, в которых член структуры/объединения 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 обеспечивает хороший пример того, где можно использовать его. Я помню видевший, что это раньше реализовывало навязчивые списки (списки, элементы данных которых включают следующие и предыдущие указатели само), но я не могу помнить, где это было полезно в реализации его, печально.
Как @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);
...
}
Это избегает необходимости писать отдельную функцию для каждого отдельного члена структуры.
Цель встроенного __ 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
Как @litb, сказал: смещение в байтах участника структуры/класса. В C++ существуют случаи, где это не определено, в случае, если компилятор будет жаловаться. IIRC, один способ реализовать его (в C, по крайней мере) должен сделать
#define offsetof(type, member) (int)(&((type *)0)->member)
Но я уверен, что существуют проблемы это, но я оставлю это заинтересованному читателю для указания...