小编Fab*_*ian的帖子

公共和私有对对象的内存布局有影响吗?

这是我的另一个问题的后续问题:班级成员的最佳顺序是什么?

如果我以公共,受保护和私人轮流的方式组织成员,它是否会改变任何事物(可见性除外)?

class Example
{
public:
  SomeClass m_sc; 
protected:
  char m_ac[32];      
  SomeClass * m_scp;
private:
  char * m_name;
public:
  int m_i1;
  int m_i2;
  bool m_b1;
  bool m_b2;
private:
  bool m_b3;
};
Run Code Online (Sandbox Code Playgroud)

这个类和我在运行时公开所有成员的类之间有区别吗?我想遵循从大到小排序类型的规则(如果可读性没有受到严重损害).

我认为它根本不会影响编译的程序,就像const只在编译期间检查一样.它是否正确?

c++

27
推荐指数
1
解决办法
2798
查看次数

这种自我指派是否做了明智的事情?

我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?

char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)

编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.

c c++

20
推荐指数
3
解决办法
4070
查看次数

如何关闭异常处理?

在"更有效的C++"(第15期)一书中,我读到如果启用了异常,即使不使用异常,代码也会变得非常慢.在我看来,异常使用有限,我试图避免它们,但这是另一个主题.

我不完全理解他的陈述:

  1. 启用/禁用异常意味着什么?它是零或多于零的try/catch块之间的区别?它是编译器标志吗?如果我使用可能发生异常的DLL会发生什么?
  2. 假设没有抛出任何异常:
    • 代码整体变慢还是只是程序进/出的部分try/catch块变慢?据作者说,两者都是真的.
  3. 如何编译无例外?即使我有try/catch块,我可以这样做吗?如果我使用的DLL可能会抛出异常,我可以这样做吗?

c++ performance exception-handling

11
推荐指数
1
解决办法
1065
查看次数

我应该使用std :: set或std :: unordered_set作为一组指针吗?

我有一套指针.在第一步中,我插入数据指针,在第二步中,我遍历整个集合并对元素执行某些操作.顺序并不重要,我只需要避免重复,这与指针比较工作正常.

我的问题是,为同一目的使用无序集是否有利.对于无序集合,插入速度更快吗?

c++ performance set

11
推荐指数
1
解决办法
2164
查看次数

为什么std :: string :: append()的功能不如std :: string :: operator +()?

我注意到了

std::string str;
str += 'b'; // works
str.append('b'); // does not work
str.append(1, 'b'); // works, but not as nice as the previous
Run Code Online (Sandbox Code Playgroud)

是否有任何理由说明该append方法不支持附加单个字符?我假设它operator+=实际上是该append方法的包装器,但似乎并非如此.

c++ string stl

11
推荐指数
2
解决办法
894
查看次数

是否可以为std :: string和std :: wstring编写一个函数?

我刚刚为std :: string编写了一个简单的实用函数.然后我注意到如果std::string是a std::wstring或a ,函数看起来完全一样std::u32string.这里可以使用模板功能吗?我不是很熟悉的模板,std::stringstd::wstring在模板本身,这可能是一个问题.

template<class StdStringClass>
inline void removeOuterWhitespace(StdStringClass & strInOut)
{
  const unsigned int uiBegin = strInOut.find_first_not_of(" \t\n");

  if (uiBegin == StdStringClass::npos)
  {
    // the whole string is whitespace
    strInOut.clear();
    return;
  }

  const unsigned int uiEnd   = strInOut.find_last_not_of(" \t\n");
  strInOut = strInOut.substr(uiBegin, uiEnd - uiBegin + 1);
}
Run Code Online (Sandbox Code Playgroud)

这是一个正确的方法吗?这个想法是否存在陷阱?我不是在谈论这个函数,而是使用模板化类StdStringClass并调用常见std::string函数(如find,replace,erase等)的一般概念.

c++ string templates stl stdstring

10
推荐指数
1
解决办法
562
查看次数

我可以使用const引用而不是getter函数吗?

我只是想知道如果我只允许一个const引用变量,我是否可以绕过使用getter,如下所示

#include <string>

class cTest
{
    private:
        int m_i;
        std::string m_str;

    public:
        const int & i;
        const std::string & str;

    cTest(void)
    : i(m_i)
    , str(m_str)
    {}
};

int main(int argc, char *argv[])
{
    cTest o;
    int i = o.i; // works
    o.i += 5; // fails
    o.str.clear(); // fails

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么人们似乎根本不这样做.我缺少一些严重的劣势吗?请提供优缺点列表,并在必要时予以纠正.

好处:

  1. 通过调用getter函数没有任何开销.
  2. 程序大小减少,因为功能较少.
  3. 我仍然可以修改类的内部,引用变量提供了一层抽象.

缺点:

  1. 我有很多参考资料,而不是getter函数.这会增加对象大小.
  2. 使用const_cast,人们可以搞乱私人成员,但这些人是恶作剧的,对吧?

c++ getter reference

9
推荐指数
1
解决办法
905
查看次数

班级成员的最佳顺序是什么?

如果我有以下课程:

class Example
{
  bool m_b1;
  SomeClass m_sc;  
  bool m_b2;
  char * m_name;
  bool m_b3;
  int m_i1;
  SomeClass * m_sc;
  int m_i2;
};
Run Code Online (Sandbox Code Playgroud)

会员的最佳顺序是什么?据我所知,在创建此类的实例时,成员声明的顺序等于内存中成员的顺序.

  • 我应该对成员进行排序,以便相同的类型在一起吗?
  • 所有指针都算作同一类型吗?
  • 重新排列是否会影响对象的大小?4或8字节对齐是否适用于此处?
  • 我怎么能看到上面的效果?sizeof是否显示对象使用的内存,包括用于对齐的空白空间?
  • 是否最好在一天结束时对成员进行排序,以便更容易理解其含义和背景?

c++ optimization

9
推荐指数
2
解决办法
810
查看次数

我可以使std :: string使用更少的内存吗?

在开始之前,我需要声明我的应用程序使用了很多字符串,这些字符串平均很小,并且一旦创建就不会更改.

在Visual Studio 2010中,我注意到std :: string的容量至少为30.即使我写std::string str = "test";了,str的容量也是30. str.shrink_to_fit()尽管std ::存在一个具有相同名称的函数,但该函数对此没有任何作用.矢量和按预期工作,即减少容量,使容量==大小.

  1. 为什么不按std::string::shrink_to_fit()预期工作?
  2. 如何确保字符串分配最少的内存?

c++ memory string visual-studio-2010

7
推荐指数
1
解决办法
1216
查看次数

如何检查 SQLite3 数据库是否在 Python 中连接?

问题 1:我在 Python 中有一个 SQLite3 连接。如何检查它是否已连接?我知道如果 sqlite3.connect() 失败,则会引发异常,但是如果我或某些人关闭了连接,我该如何检查并在必要时重新打开它?

问题 2:我可以在连接打开时移动文件系统中的文件(无法删除)。无论出于何种原因,数据库随后变为只读。如果我把它移回去,它就好像什么都没发生一样。有人可以解释一下吗?我应该在访问前检查 isfile(dbpath) 吗?

python sqlite

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