相关疑难解决方法(0)

数组与0元素的对齐

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对齐的地址?此外,如果我编写自定义分配器,在这种情况下我是否需要返回指向对齐地址的指针?

c++ allocator language-lawyer c++11

22
推荐指数
1
解决办法
434
查看次数

零大小的结构

我注意到,当使用GCC编译时,4.6 sizeof(Foo)是0并且sizeof(Bar)是1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两个结构的大小必须相同.这里发生了什么?

struct Foo
{
    char x[];
};

struct Bar {};
Run Code Online (Sandbox Code Playgroud)

c c++ gcc

12
推荐指数
1
解决办法
1924
查看次数

如何使我的 sizeof sum 结构与空参数包一起工作

我有这个可变参数结构来确定传入的所有类型的大小总和:

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 可用。

c++ c++14

8
推荐指数
2
解决办法
183
查看次数

什么是sizeof(某事)== 0?

我有一个模板,它采用具有不同值的结构,例如:

struct Something
{
    char str[10];
    int value;
    ...
    ...
};
Run Code Online (Sandbox Code Playgroud)

在函数内部我使用sizeof运算符:跳入内存 sizeof(Something);

有时我想不跳任何东西; 我希望sizeof返回零.如果我输入一个空结构,它将返回1; 我可以在模板中放置什么来使sizeof返回零?

c++ templates sizeof

6
推荐指数
2
解决办法
1634
查看次数

大小为0的对象

我知道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)

这个特定的内存位置是否占用?如果我稍后在程序中分配内存,是否有可能使用此位置?

c++

5
推荐指数
2
解决办法
220
查看次数

标签 统计

c++ ×5

allocator ×1

c ×1

c++11 ×1

c++14 ×1

gcc ×1

language-lawyer ×1

sizeof ×1

templates ×1