kle*_*lew 1 c++ arrays class sizeof
这个问题是关于C++的
我一直认为C++中数组的名称只是一个指针,所以我想到了
int ar[10];
cout << sizeof(ar);
Run Code Online (Sandbox Code Playgroud)
会给我一样的sizeof(int *)
.但它给出了40 - 所以它是整个阵列的真实大小.当变量给出数组大小时,它也给出40:
int n = 10;
int ar[n]
Run Code Online (Sandbox Code Playgroud)
我想复制一个包含数组的类.如果它将与运算符一起分配,new
那么我应该在复制构造函数中手动复制此数组.但是恒定大小的阵列怎么样?类只包含指向数组的指针,还是包含整个数组?简单memcpy(...)
安全吗?
编辑:另一个例子:
int n;
cin >> n;
int ar[n];
cout << sizeof(ar);
Run Code Online (Sandbox Code Playgroud)
它打印n*4.我在linux上使用g ++.
我甚至试过这个:
class Test {
public:
int ar[4];
};
Run Code Online (Sandbox Code Playgroud)
和
Test a, b, c;
a.ar[0] = 10;
b = a;
memcpy(&c, &a, sizeof(a));
a.ar[0] = 20;
cout << "A: " << a.ar[0] << endl;
cout << "B: " << b.ar[0] << endl;
cout << "C: " << c.ar[0] << endl;
Run Code Online (Sandbox Code Playgroud)
它给出了:
A: 20
B: 10
C: 10
Run Code Online (Sandbox Code Playgroud)
因此,数组存储为类的一部分,可以使用memcpy进行复制.但它安全吗?
数组不是指针.当/如果将它作为参数传递给函数时,数组的名称"衰减"到指针 - 但是sizeof
是一个内置于语言中的运算符,而不是函数,所以sizeof(array)
只要它是一个数组的实际大小就会产生应用于实际数组(与作为参数传递的数组的名称相反,然后使用sizeof()
它传递给函数时衰减的指针).
至于复制包含数组的类,如果它确实是一个数组,如:
class X {
int x[10];
};
Run Code Online (Sandbox Code Playgroud)
然后你不需要做任何事情来复制它 - 编译器可以/将生成一个复制构造函数来复制数组的内容.如果(并且仅当)你实际上有一个指针,并自己分配空间,你是否需要写一个副本ctor来做一个"深层复制"(即在新对象中分配空间,并复制由指针).但是,不应该这样做,你通常应该使用一个std::vector
内部所有内容,所以你不必担心它.
一次拿这些:
我想复制一个包含数组的类.
好的,例如:
class Foo
{
int arr[20];
};
Run Code Online (Sandbox Code Playgroud)
如果它将使用operator new分配,那么我应该在复制构造函数中手动复制此数组.
好的,现在混乱开始了.在上面的例子中,数组实际上是对象的一部分. sizeof(Foo)
如果int
是4个字节会给你80 .
另一种方法是使用指向数组的指针,如果数组需要更改大小,这将非常有用:
class Bar
{
int *arr;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,sizeof(Bar)
是指针的大小(通常是4或8个字节),复制对象复制指针.这被称为"浅拷贝".如果你想要一个"深层复制",即一个副本会复制数组的内容而不仅仅是对象,那么你需要一个复制构造函数.
第三种选择是使用vector
,因为小麦建议:
class Bob
{
std::vector<int> arr;
};
Run Code Online (Sandbox Code Playgroud)
这在内部的工作原理与Bar
案例相同,并且vector
可以调整大小,但vector
模板会为您处理深层复制,因此您不需要复制构造函数.
Foo
如果你需要一个固定大小的数组,我会推荐这种情况,其中大小在编译时是已知的,Bob
否则就是这种情况.该Bar
案件非常简单,只是重新发明轮子.
简单的memcpy(...)在这里安全吗?
安全Foo
.Bar
如果您想要浅色复印,则可以安全使用.不安全Bob
.
故事的寓意是将变量存储在对象中就像将其存储在功能块或全局中一样:如果指定一个数组([N]
而不是*
),则最好在编译时确定大小,然后获得存储就在那里.
归档时间: |
|
查看次数: |
1712 次 |
最近记录: |