почему массив меньше матрицы меньше вектора? c++

Я пытаюсь прочитать файл mnist и поместить элементы в вектор матрицы.код для чтения mnist

      for(int r=0;r<n_rows;++r)
        {
            
            for(int c=0;c<n_cols;++c)
            {
                unsigned char temp=0;
                file.read((char*)&temp,sizeof(temp));
                data[r][c] = temp;
                //std::cout<< "r: "<<r<< " c: "<<c<<" temp: "<<sizeof(temp)<<"\n";
            }
        }//this print my array the correct way
        for(int k=0;k<28;k++){
            for(int z=0; z<28;z++){
                std::cout<<data[k][z]<<" ";
                if(z==27){
                    std::cout<<"\n";
                }
            }
        }

        cv::Mat img(28,28,CV_8U,&data);
        mnist.push_back(img);
        std::cout<<"data: "<<sizeof(data)<<" img: "<<sizeof(img)<<" mnist: "<<sizeof(mnist)<<"\n";

вывод последней строки выше:

      data(array): 784 img(cv::Mat): 96 mnist(vector of matrix): 24

они не должны быть хотя бы одного размера? вот почему я думаю, что когда я печатаю, моя матрица не показывает правильный вывод (такой же, как массив), я предполагаю, что вектор ссылается на матрицу, а матрица ссылается на массив, но затем что-то меняется в памяти где-то, и это почему результат не такой, как я ожидал?

[редактировать]

приведенный выше код находится в функции, возвращающей вектор матрицы.

Когда я использую код внутри основной функции, результат в порядке!

может кто-нибудь объяснить?

Я бы предпочел иметь это в отдельной функции вместо гигантской основной ... но я буду продолжать работать с тем, что работает сейчас.

1 ответ

Решение

В основном вы не понимаете, что делает. Он возвращает размер типа объекта, но не размер всей памяти, которой владеет объект или на которую он ссылается. Чтобы быть конкретным, размер указателя обычно составляет 8 байтов независимо от того, на сколько памяти указывает указатель, например

      int main()
{
    int* foo;
    std::cout << "foo is " << sizeof(foo) << " bytes.\n";

    foo = new int[10000];
    std::cout << "foo is still " << sizeof(foo) << " bytes.\n";

}

Остальной ответ на ваш вопрос следует из вышеизложенного. Например, часто 24 байта, потому что это часто реализуется с использованием трех указателей.

Другие вопросы по тегам