С++ работа с памятью, шаблоны

176
05 октября 2021, 10:10
#include <iostream>
using namespace std;
template <typename type>
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? И как внутри шаблона функции получить информацию об использованной массивом памяти? Спасибо!

Answer 1

В данном случае a в шаблоне не будет массивом, так как массивы нельзя передавать по значению, а аргументы-массивы неявно переделываются в аргументы-указатели. В этом можно легко убедиться, добавив в метод проверку:

static_assert(::std::is_same_v<int *, type>);

Для корректного определения размера исходного объекта придется передавать его по ссылке:

template <typename type>
::std::size_t size(type const & a) {
    return sizeof(a);
}
Answer 2

Компилятор вполне может вычеслять type(по аргументу функции) как тип, содержащий столько то обьектов, так как может вызываться std::size. И для следующей программы:

int a[15] = { 5 };  
cout << size(a); //15

получим результат 15

В общем случаи всегда лучше аргументы шаблонной функции передавать по ссыльке и не использовать имена из стандартной библиотеки, и не использовать все имена из std (using namespace std )

READ ALSO
Надо ли писать два двоеточия перед std?

Надо ли писать два двоеточия перед std?

Некоторые авторы используют два двоеточия :: перед неймспейсом std, например:

189
Коды русских символов (не в консоли)

Коды русских символов (не в консоли)

Есть строка, нужно перевести русские символы в ней на аналогичные английские (А на А, В на В,

152
c++ написал прогу по фану а там

c++ написал прогу по фану а там

написал прогу по фану на с++ а она почему то не вызывает ошибку 0_0

102
Как вызвать два метода по клику в Vue Js

Как вызвать два метода по клику в Vue Js

В разработке приложения я использую vue cli у меня есть такой код

217