Реализуйте свой собственный размер
Вот реализация.
#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)