#cpp #память #шаблоны #sizeof
#includeusing namespace std; template int size(type a) { return sizeof(a); } int main() { int a[10] = {5}; cout << size(a) << " " << sizeof(a) << endl; return 0; } Здравствуйте! Пожалуйста можете объяснить почему size(a) возвращает 8, а sizeof(a) - 40? И как внутри шаблона функции получить информацию об использованной массивом памяти? Спасибо!
Ответы
Ответ 1
В данном случае a в шаблоне не будет массивом, так как массивы нельзя передавать по значению, а аргументы-массивы неявно переделываются в аргументы-указатели. В этом можно легко убедиться, добавив в метод проверку: static_assert(::std::is_same_v); Для корректного определения размера исходного объекта придется передавать его по ссылке: template ::std::size_t size(type const & a) { return sizeof(a); } Ответ 2
Компилятор вполне может вычеслять type(по аргументу функции) как тип, содержащий столько то обьектов, так как может вызываться std::size. И для следующей программы: int a[15] = { 5 }; cout << size(a); //15 получим результат 15 В общем случаи всегда лучше аргументы шаблонной функции передавать по ссыльке и не использовать имена из стандартной библиотеки, и не использовать все имена из std (using namespace std )
Комментариев нет:
Отправить комментарий