Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

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

#cpp #память #шаблоны #sizeof


#include 

using 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 )

Комментариев нет:

Отправить комментарий