Реализуйте свой собственный размер

Опубликовано: 1 Января, 2022

Вот реализация.

#include<stdio.h>
#define my_sizeof(type) (char *)(&type+1)-(char*)(&type)
int main()
{
double x;
printf ( "%ld" , my_sizeof(x));
getchar ();
return 0;
}

Тип похож на локальную переменную макроса. & type дает адрес переменной (double x), объявленной в программе, а увеличение его на 1 дает адрес, где может быть сохранена следующая переменная типа x (здесь addr_of (x) + 8, поскольку размер double равен 8B ).
Разница дает результат: сколько переменных типа x может быть сохранено в том объеме памяти, который, очевидно, будет равен 1 для типа x (для увеличения его на 1 и взятия разницы - это то, что мы сделали). Приведя его к типу char * и взяв разницу, мы узнаем, сколько переменных типа char может быть сохранено в данном пространстве памяти (разница). Поскольку для каждого символа требуется только 1 Б памяти, то (количество памяти) / 1 даст количество байтов между двумя последовательными ячейками памяти типа переменной, переданной в макрос, и, следовательно, объем памяти, который переменная тип x требует.
Но вы не сможете передать этому макросу какой-либо литерал и узнать их размер.

Вы также можете реализовать использование функции вместо макроса, но реализация функции не может быть выполнена на C, поскольку C не поддерживает перегрузку функций, а sizeof () должен получать параметры всех типов данных.

Обратите внимание, что в приведенной выше реализации предполагается, что размер символа составляет один байт.

Сложность времени: O (1)
Космическая сложность: O (1)

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .