当底层OpenGL状态被修改时,我应该声明一个方法常量吗

Should I declare a method const, when underlying OpenGL state is modified

本文关键字:一个 常量 方法 声明 我应该 OpenGL 状态 修改      更新时间:2023-10-16

以下类封装了缓冲区的OpenGL名称,并提供了一些更改缓冲区状态的方法:

class BufferObject {
    public:
        explicit BufferObject( GLenum type );
        virtual ~BufferObject();
        // some methods omitted
        void    dataStore( GLsizeiptr size, const GLvoid* data, int usage );
        void*   mapBufferRange( GLintptr offset, GLsizeiptr length, int accessFlag );
        void    unmapBuffer() const;
    private:
        GLuint object_;
};

这些方法都不会更改BufferObject对象的状态,因此它们都可以用const声明。然而,dataStoremapBufferRange都调用OpenGL方法来更改GPU上对象的状态(分别为glBufferDataglMapBufferRange)。我想在没有const的情况下声明它们,以表明它们正在修改GPU上的状态。

在这种情况下,最好的做法是什么?

你说得对,因为它们不会修改对象本身的实际状态,所以你可以选择。

虽然没有硬性规定,但"尽可能使用const"绝对不是通用的方法。请参阅std::vector::operator[]—它不会更改vector对象的成员,但仍然提供非const版本(以及不同的const版本)。

一个很好的方法是:假设您有一个BufferObject,并将其传递给一个使用const BufferObject&的函数。如果该函数调用dataStore(),它会打乱您的期望(您期望保持的不变量)吗?如果是,请不要将dataStore()标记为const

为了解决您的特殊情况,我认为您是正确的,应该将这些函数保留为非-const。虽然它们不修改C++对象的物理内容,但它们修改由该C++对象表示的实体的逻辑状态。