@gifon

Как вывести длинну переменной или массива?

Привет, у меня есть код
#include <iostream>

template<typename T>
void ReadSize(long long addr, T& buffer){
    std::size_t size = sizeof(T);
    std::cout << size << std::endl;
}

template<typename T, std::size_t N>
void ReadSize(long long addr, T (&buffer)[N]){
    std::size_t size = sizeof(T) * N;
    std::cout << size << std::endl;
}

int main() {
    std::cout << "single var!" << std::endl;
    int value = 10;
    ReadSize(0, value);
    
    std::cout << "array!" << std::endl;
    int values[10];
    ReadSize(0, values);
    
    return 0;
}

он выводит длинну переменной
а так же длинну масива (не просто длинну указателя на масив а всего массива)
но я 2 раза написал одну и ту же функцию, как это оптимизировать
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 3
@dima20155
you don't choose c++. It chooses you
Заменить
std::size_t size = sizeof(T) * N;
на
std::size_t size = sizeof(T) * N / sizeof(buffer[0]);

или просто использовать
std::size

P.S. Неправильно понял вопрос. Правильный ответ в моем первом комментарии.
Ответ написан
@res2001
Developer, ex-admin
Массив может быть представлен по разному.
Для статического массива sizeof(arr) сразу возвращает размер массива в байтах.
Для указателя на массив sizeof(ptr_arr) возвращает размер указателя. Чтоб получить размер массива в этом случае надо сделать sizeof(ptr_arr[0])*N.
Когда вы передает в функцию статический массив, то внутри функции это все равно указатель (не смотря на то, что в аргументе он может быть объявлен как int arr[N]) и sizeof над ним ведет себя как с указателем, а не как с массивом.

Вариант sizeof(arr[0])*N будет правильно работать как с указателем так и со статическим массивом.
При этом реального обращения к памяти arr[0] не происходит, поэтому этот вариант можно использовать даже в таком случае:
int *ptr_arr=NULL;
size_t size_arr = sizeof(ptr_arr[0])*N;
Ответ написан
Комментировать
@tifco
Методы:
size() - возвращает число элементов в контейнере,
max_size() - возвр. максимально допустимый размер контейнера,

begin() - возвр. итератор на начало контейнера (итерации в прямом направлении),
end() - возвр. итератор на конец контейнера (итерации в прямом направлении завершатся),

rbegin() - возвр. реверсивный итератор на конец контейнера (итерации в обратном направлении),
rend() - возвр. реверсивный итератор на начало контейнера (итерации в обратном направлении завершатся).

Это не подойдет?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы