0x1337 – Telegram
0x1337
292 subscribers
6 photos
9 files
19 links
Y0L0 DUD33333
Download Telegram
Ну и говоря о том, куда пропал и почему все вдруг резко встало, замечу:

Честные 100Гбит/Сек с одной сетевой карточки(Mellanox, например) - реальность, даже если papers говорят обратное(да, какие-то части Ядра Linux, можно и переписать...)

#Job
Ну что, вот и объяснительная:

Понятно, что одна точка, это использование оператора '.' или, оператора '.*', например.

Три точки - VA_ARGS Template Parameter Pack или Функции с неизвестным числом параметров(printf, например).

Шесть точек - объединение VA_ARGS Template Parameter Pack и Функций с неизвестным числом параметров. Такой подход находит свое применение в type_trait-е определения функции is_function:

https://en.cppreference.com/w/cpp/types/is_function

И, наконец, самое интересное, это 4 точки:

Выражения свертки(C++17) + оператор '.*'. Да, использовать обычный '.' запрещено, а вот '.*' - можно.

https://en.cppreference.com/w/cpp/language/fold

#answers #quiz
Магические числа в начале того или иного файла, могут использоваться не только для идентификации используемого формата, но и для определения того, в каком порядке байт(little / big endian) была произведена запись файла, то есть, в каком порядке нам следует его читать. За примером далеко ходить не надо: *.pcap, например.

#magic_numbers
В GCC, кстати, можно #include (7 символов, без учёта решётки) заменить на #import (6 символов, без учёта решётки). Краткость сестра таланта, ведь так?

https://wandbox.org/permlink/ieB5oMwoPql0JGkd

#gcc #extension
А ещё в GCC можно писать вот так:

x ? : y, что равносильно x ? x : y

#gcc #extensions
Окей, задавать вопросы по С++ можно вечно, а что на счет Интересных Решений из той же серии :?

Дано:

struct bar 
{
bar() { std::cout << "bar deft ctor\n"; };
bar( bar&& ) { std::cout << "bar move ctor\n"; };

bar( const bar& ) = delete;
};

template<class T>
const T foo(); // где-то в другой библиотеке, которую мы менять не можем

bar buz()
{
return foo<bar>();
}

int main()
{
auto a = buz();

return 0;
}

Менять foo и bar - не можем. Как вызвать move, не поломав ничего в программе и не используя C++17 :?

С Флагом C++17 - это будет работать прекрасно!
Окей, томить с решением я не стану. Вообще, не знал как выстроить наше с вами общение по этому вопросу. Предлагаю вот такое вот интересное решение:

struct bar
{
bar() { std::cout << "bar deft ctor\n"; };
bar( bar&& ) { std::cout << "bar move ctor\n"; };

bar( const bar& ) = delete;
};

struct bar_wrapper
{
mutable bar wrapped_bar;
};

template<class T>
const T foo(); // где-то в другой библиотеке, которую мы менять не можем

bar buz()
{
return foo<bar_wrapper>().wrapped_bar;
}

Как мне кажется, получилось весьма интересно и красиво. Это то, ради чего затевался пост выше и никак иначе. Я бы назвал этот промежуточный Wrapper - мутатором.

#cxx #interesting
Эффективное_программирование_на_платформе_Эльбрус.pdf
1 MB
Эффективное программирование на платформе Эльбрус.

#Эльбрус #optimization
Primer_on_reversing_symbian_s60_applications_by_shub_nigurrath_v14.pdf
4.4 MB
Работы вагон, того и постов нет. Но я тут это, про Symbian S60 накинуть хотел: как никак, а OS легендарная. А посты будут совсем скоро, да.

#reverse #symbian #asm
Я люблю Data-Oriented Design, а еще люблю C. ECS и GUI? Почему бы и нет:

https://dl.acm.org/doi/pdf/10.1145/3286689.3286703

#ECS #DOD
Так, и ошибка у нас в ...

struct A
{
unsigned int m_a = 1337u;
};

int main()
{
static_assert( std::is_invocable<decltype( &A::m_a ), A>::value ); // 1

std::invoke( &A::m_a, A() ); // 2

return 0;
}
Bonne nuit! Знаю, что посты стали крайне редкими, а обещанные статьи, все никак не дойдут до публикации. Так происходит потому, что я очень-очень-очень люблю свою работу, о чем не стесняюсь рассказывать публично [https://vk.com/id533333]. Работы сложной, интересной и ответственной очень-очень-очень много, и даже сейчас, на ночь глядя, я работаю в офисе :) Тем не менее, кое-что для вас у меня есть:

Дан такой кусочек C++ кода:

void call_me()
{}

void* ptr_1 = static_cast <void*>( call_me ); // 1
...
void* ptr_2 = reinterpret_cast<void*>( call_me ); // 2
...
reinterpret_cast<void(*)()>( ptr_2 );
// 3

Определите верное описание происходящего.

UPD: под implementation defined также можно рассматривать conditionally-supported поведение.
1
Кстати, вы всегда можете поспорить со мной, написав сюда: @ioann_v
Говоря о выше написанном, разберем, о том, почему же последние два случая - implementation defined.

Стандарт разделяет понятия pointer to object и pointer to function. Вот, что известно о void*:

The type of a pointer to void or a pointer to an object type is called an object pointer type.

А вот что известно о reinterpret_cast преобразовании function pointer to an object pointer:

Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cv-qualification, shall yield the orignal pointer value.

Интересным здесь является появление поведения, именуемого
conditionally-supported

[defns.cond.supp] conditionally-supported - "program construct that an implementation is not required to support"

[defns.impl.defined] implementation-defined behavior - "behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation documents"

То есть, если описанное не поддерживается, то обязательно должна быть диагностика этого случая.

P.S: До C++11 такое приведение было illegal.

#cxx #cxx11
Мы тут, кстати, решили потестировать 'новый' и 'уникальный', безумно 'умный' сервис от Артемия Лебедева - Николай Иронов aka дизайнер, художник и нейросеть для генерации логотипов. Вот, что вышло(коротко - shit merged):

https://tjournal.ru/internet/215408-nikolay-ironov-okolo-tehnicheskiy-obzor-na-to-kak-ya-vykinul-9900

#interesting
Привет, я снова на связи. На большие посты / статьи - нету времени, поэтому, я решил сделать новую рубрику - 'Содержит ли данный кусок кода, баг?'. Суть простая: я скидываю кусок C/C++ кода и опросник из двух вариантов ответа - есть баг, или нету бага. Ваше дело, выбрать верный. Да, скидывать код без багов я также собираюсь - и буду делать это очень умело :)
struct elem_t
{
uint64_t prev_time;
uint64_t stats;

mutex_t mtx;
};

....

// Код некоторой функции, вызываемой в разных потоках. elem aka elem_t - шарим между потоками.

uint64_t curr_time = get_current_time_ns();

elem->mtx.l();

elem->stats += curr_time - elem->prev_time;

elem->prev_time = curr_time;

elem->mtx.u();
1