C++ 允许动态分配零大小的数组:
int* p = new int[0];
delete[] p;
Run Code Online (Sandbox Code Playgroud)
我不能用这样的指针做很多事情(因为数组没有元素),但是新表达式需要给我一个有效的(!= nullptr)指针,然后我必须delete[]再次将它作为一个实际的数组.
有关这种新表达式返回的内存对齐的要求吗?考虑:
struct alignas(8) Foo {
int x;
};
Foo* p = new Foo[0];
delete[] p;
Run Code Online (Sandbox Code Playgroud)
为p保证指向8对齐的地址?此外,如果我编写自定义分配器,在这种情况下我是否需要返回指向对齐地址的指针?
我注意到,当使用GCC编译时,4.6 sizeof(Foo)是0并且sizeof(Bar)是1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两个结构的大小必须相同.这里发生了什么?
struct Foo
{
char x[];
};
struct Bar {};
Run Code Online (Sandbox Code Playgroud) 我有这个可变参数结构来确定传入的所有类型的大小总和:
template <typename U, typename... T> struct TotalSizeOf
: std::integral_constant<size_t, sizeof(U) + TotalSizeOf<T...>::value> {};
template <typename U> struct TotalSizeOf<U>
: std::integral_constant<size_t, sizeof(U)> {};
Run Code Online (Sandbox Code Playgroud)
用法:
TotalSizeOf<double, int, char>::value
问题是,我如何修改它以允许它处理空参数包,返回0;
例如 TotalSizeOf<>::value
目前,我收到错误 error: wrong number of template arguments (0, should be at least 1)
我只有 C++14 可用。
我有一个模板,它采用具有不同值的结构,例如:
struct Something
{
char str[10];
int value;
...
...
};
Run Code Online (Sandbox Code Playgroud)
在函数内部我使用sizeof运算符:跳入内存 sizeof(Something);
有时我想不跳任何东西; 我希望sizeof返回零.如果我输入一个空结构,它将返回1; 我可以在模板中放置什么来使sizeof返回零?
我知道C++中的空类大小为1个字节.但是,我注意到sizeof()为此类的对象返回0(以g ++为单位):
class Boom{
int n[0];
}
Run Code Online (Sandbox Code Playgroud)
我可以为Boom对象打印有效的内存位置:
Boom b;
cout<<&b;
Run Code Online (Sandbox Code Playgroud)
这个特定的内存位置是否占用?如果我稍后在程序中分配内存,是否有可能使用此位置?