【问题标题】:Static member function for non static members非静态成员的静态成员函数
【发布时间】:2017-01-02 12:58:03
【问题描述】:

我希望我的标题不会误导,但我想问一些我不知道正确标题的问题。

首先,我不是在问是否可以通过静态函数调用非静态成员。我知道非静态成员属于对象的一个​​实例,而静态函数属于对象本身。我想知道的是不同的东西。

我在硕士论文期间开发了一个占用大量内存的程序。我想知道为什么,因为我一直在使用引用,并且仅在确实需要时才复制变量和对象。但是,检查内存分配时,我注意到我的对象每个占用 250kB 内存,而且我有很多。我想通过仅实例化真正需要实例化的内容来减少内存量。

创建我的对象的实例也会为我的对象中的每个成员函数创建一个实例。我现在的问题是:

由于函数不会改变但值会改变,我可以将函数声明为静态函数,这样它就不需要一直复制,但仍然可以对非静态成员变量执行更改实例?

我希望我的要求很清楚。

为了强调我的想法,我想举一个小例子。

假设我有以下代码

class myObject(){
    myType myVariable;
    void getMyVariable(myType &typRef){
        typRef = this->myVariable;
    }
}
int main(){
    myObject o1;
    myObject o2;

    myType t1;
    myType t2;

    o1.getMyVariable(t1);
    o2.getMyVariable(t2);

    std::cout << "Variable of object 1 is " << t1 << std::endl;
    std::cout << "Variable of object 2 is " << t2 << std::endl;
}

我两次调用getMyVariable(myType &amp;) 函数。但是,存储一次就足够了,因为我对每个实例都执行相同的操作。唯一改变的是我得到的变量。

c++ 中是否有一些关键字允许以静态方式存储函数,但动态地将实例的非静态成员保存为该函数的可交换值。

希望现在更清楚我在寻找什么。

【问题讨论】:

  • 看起来一个基本的误解让你误入歧途。只有成员变量存储在对象中。向我们展示成员变量。
  • 您似乎也对类、对象和实例感到困惑。类是一种类型。对象是一种类型的实例。
  • 哦,好吧,我似乎有点困惑,因为我对术语不是 100% 有信心。我不知道函数默认只存在一次,这很好,所以我不必担心。感谢那。在调试模式下检查内存分配表明我的成员变量之间存储了很多空内存。知道为什么吗?
  • 了解 paddingalignment
  • 题主为什么要加一堆不相关的函数?

标签: c++ static


【解决方案1】:

创建我的对象的实例,也为我的对象中的每个成员函数创建一个实例。

不,它没有。函数只存在一次,位于专门用于代码的内存部分中,并且不以任何方式与单个对象关联。

c++ 中是否有一些关键字允许以静态方式存储函数,但动态地将实例的非静态成员保存为该函数的可交换值。

在 C++ 中没有这个关键字,因为它是默认发生的(并且没有办法绕过它)。

如果您的对象太大,那是因为它们存储了太多数据。代码是对象数据布局的一部分,会影响其大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2011-05-31
    • 1970-01-01
    • 2013-05-03
    • 2012-04-13
    • 2011-01-27
    • 2021-12-03
    相关资源
    最近更新 更多