相关疑难解决方法(0)

定制内存管理器

我正在尝试实现一个自定义内存管理器,我想知道是否有更好的方法来实现这个函数,因为当我被问及无效指针算术时,有些人认为如果我在C++中有一个void*,那就非常错误.

// allocates a page of memory.
void ObjectAllocator::allocatePage()
{    
    //if(OAStats_.PagesInUse_ >= Config_.MaxPages_)
        //throw exception

    void* buffer = ::operator new(OAStats_.PageSize_); // allocate memory, no constructor call.

    // =============== Setup the PageList_ ===============
    GenericObject* pNewNode = ::new(buffer) GenericObject();    // Construct GenericObject for the pagelist.
    pNewNode->Next = PageList_->Next;                            // pNewNode points to wherever PageList_ pointed to.
    PageList_->Next = pNewNode;                                    // PageList_ points to pNewNode
    pNewNode = NULL;                                            // dont need this handle anymore
    buffer = static_cast<char*>(buffer) + sizeof(GenericObject);    // move pointer to …
Run Code Online (Sandbox Code Playgroud)

c++

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

void时指针算法的大小未知

在Visual Studio C++版本9(也可能是其他版本)中,以下代码:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
Run Code Online (Sandbox Code Playgroud)

生成这些 错误:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Run Code Online (Sandbox Code Playgroud)

此代码在GCC下工作,GCC sizeof(void)视为1.

是否存在一些解决此限制的方法,因为char *为了指针运算的目的而明确地进行转换会增加混淆(void *被公认并被用作原始内存的无类型指针).

Update0

  • 请注意,我很清楚标准的存在.
  • 想做原始指针算术.
  • sizeof(void)认为我很清楚这不是1导致问题的原因.
  • 代码示例仅用于演示生成错误所需的内容.
  • 我知道这不是一种"正常"的使用方式void,但这是C,这些事情都会发生.
  • 是的,人们需要在低级别这样做.我不是在追求原因,我是在追求如何.如果你想知道原因,请查看一些内核源代码或友好的glibc.

UPDATE1

看来这个问题引起了很大的混乱.现在的问题不是关于为什么sizeof(void) == 1不标准,但做什么时,它不是.

在要进行单字节指针运算的情况下,事实证明,转换为char *正确的答案,不是因为*(void *)没有大小,而是因为标准实际上保证了这*(char *) …

c gcc void-pointers pointer-arithmetic visual-studio

2
推荐指数
3
解决办法
8868
查看次数

当sizeof(char)!= 1时,C中的字节精度指针算术

如何以单字节精度可移植地执行指针运算?

请记住:

  • char 在所有平台上都不是1个字节
  • sizeof(void) == 1 仅作为GCC的扩展名提供
  • 虽然某些平台可能具有指针deref指针对齐限制,但算术仍可能需要比最小基本POD类型的大小更精细的粒度

c compiler-construction portability void-pointers pointer-arithmetic

1
推荐指数
2
解决办法
3089
查看次数