为什么数组小于矩阵小于向量? C++
why array is smaller than matrix smaller than vector ? c++
我正在尝试读取 mnist 文件并将元素放入矩阵向量中。
code to read 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
它们不应该至少相同大小吗?
这就是为什么我认为当我打印矩阵时没有显示正确的输出(与数组相同)
我猜向量是在引用矩阵,而矩阵是在引用数组,但是内存中某处发生了一些变化,这就是为什么输出不是我所期望的?
[编辑]
上面的代码在返回矩阵向量的函数中。
当我在主函数中使用代码时,输出正常!
谁能解释一下?
我更愿意将它放在一个单独的函数中,而不是拥有一个巨大的主函数...但我会继续使用目前有效的方法。
基本上你误解了 sizeof
的作用。它 returns 对象类型的大小,但不是对象拥有或引用的所有内存的大小。具体来说,无论指针指向多少内存,指针的大小通常为 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";
}
您问题的其余答案来自上述内容。例如,一个 std::vector
通常是 sizeof
24 个字节,因为它通常使用三个指针来实现。
我正在尝试读取 mnist 文件并将元素放入矩阵向量中。 code to read 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
它们不应该至少相同大小吗? 这就是为什么我认为当我打印矩阵时没有显示正确的输出(与数组相同) 我猜向量是在引用矩阵,而矩阵是在引用数组,但是内存中某处发生了一些变化,这就是为什么输出不是我所期望的?
[编辑]
上面的代码在返回矩阵向量的函数中。
当我在主函数中使用代码时,输出正常!
谁能解释一下?
我更愿意将它放在一个单独的函数中,而不是拥有一个巨大的主函数...但我会继续使用目前有效的方法。
基本上你误解了 sizeof
的作用。它 returns 对象类型的大小,但不是对象拥有或引用的所有内存的大小。具体来说,无论指针指向多少内存,指针的大小通常为 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";
}
您问题的其余答案来自上述内容。例如,一个 std::vector
通常是 sizeof
24 个字节,因为它通常使用三个指针来实现。