标签: c++98

非整数常量如何在C++中工作?

所以我知道在C++常量中,默认情况下获得的变量与变量不同.这就是我不能放的原因

int foo;
Run Code Online (Sandbox Code Playgroud)

在一些标题中 - 链接器会正确地抱怨多个定义.OTOH,我可以写

const int bar = 42;
Run Code Online (Sandbox Code Playgroud)

在标题中,编译器确保只有一个定义bar.

使用积分常量,很容易看出编译器如何处理这个 - 至少只要没有人获取地址bar或做一些其他有趣的事情,需要它为它分配存储).但是,如果有人怎么办?如果它不是一个整体但需要在运行时执行的代码呢?假设我将其放入标题中:

const std::string baz = "h2g2";
Run Code Online (Sandbox Code Playgroud)

假设没有小的字符串优化,这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某处,等等.

我假设我最终会得到baz每个翻译单元的一个定义,只是编译器为其分配内部链接以防止链接器抱怨?或者我错过了什么?

注意:constexpr普通的旧C++常量不感兴趣,因为它们自80年代以来就存在并且在C++ 98中编纂.(但是,如果一个全面的答案将包括这一切如何融合在一起constexpr,我不会抱怨.)

c++ constants linkage c++98

8
推荐指数
1
解决办法
286
查看次数

使用const ref参数进行自我赋值的行为

我偶然发现了一些非常古老的代码,它有一个带有定义的复制赋值运算符的类,它将其参数作为const引用,但也不检查自赋值,所以基本上:

struct A
{
    int q;
    A(): q(3) {}

    A& operator=(const A& a)
    {
        q = a.q;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

当一个实例A被赋给自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它"破坏"参数的常量,任何编译器都可以假设参数没有改变并基于此进行优化.

然而,clang和gcc都没有发出警告,程序运行正常.如果我q在赋值运算符中赋值之前显式将值更改为4,这也可以工作.

c++ c++98

8
推荐指数
1
解决办法
620
查看次数

std :: copy/memcpy/memmove优化

我查看了GCC STL(4.6.1)并看到std::copy()在内置__is_trivial()评估的情况下使用优化版本true.

由于std::copy()std::reverse_copy()模板对于复制数组中的元素非常有用,我想使用它们.但是,我有一些类型(模板实例化的结果),它们是包含一些简单值,没有指针并且没有复制构造函数或赋值运算符的结构.

G ++足够聪明,可以发现我的类型实际上是微不足道的吗?在C++ 98中是否有任何方法可以确保STL实现知道我的类型是微不足道的?

我想在C++ 11中,使用is_trivial<>类型特征会变得很方便.这是正确的吗?

谢谢!

编辑:很抱歉这么晚,但这是一个非常简单的Type类的例子,这对GCC和llvm来说并不简单.有任何想法吗?

#include <iostream>

struct Spec;

template <typename TValue, typename TSpec>
class Type
{
public:
    TValue value;

    Type() : value(0) {}
};

int main()
{
    std::cerr << "__is_trivial(...) == "
              << __is_trivial(Type<char, Spec>) << '\n';                                                                                                                                                                                                                                    
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

c++ stl c++11 c++98

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

阅读c ++ 11书需要具备c ++ 98的知识吗?

我目前正在阅读一本2000年写的c ++书,基本上就是使用c ++ 98.(如果我错了,请纠正我)

我的问题是,阅读像这样的c ++ 11书(http://rads.stackoverflow.com/amzn/click/0321563840),大多数用户建议,要求我已经读过一本c ++ 98书?

c++ c++11 c++98

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

我应该在使用std :: back_inserter时保留内存

使用背部时是否需要保留内存:插入器?

d.reserve(s.size())
std::copy (s.begin(),s.end(),back_inserter(d));
Run Code Online (Sandbox Code Playgroud)

c++ std c++98

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

便携式检查无限和非数字

我正在寻找一些不使用有关浮点类型实现的假设的东西,并且不使用C++ 11/C99方法.

以下代码是检查INF和NAN的可靠方法吗?如果没有,究竟会出现什么问题?

bool isfinite(double n)
{
    if(std::numeric_limits<double>::has_infinity)
    {
        double inf = std::numeric_limits<double>::infinity();
        if(std::memcmp(&n, &inf, sizeof(double)) == 0)
            return false;

        double neginf = -inf;
        if(std::memcmp(&n, &neginf, sizeof(double)) == 0)
            return false;
    }

    if(std::numeric_limits<double>::has_quiet_NaN)
    {
        double nan = std::numeric_limits<double>::quiet_NaN();
        if(std::memcmp(&n, &nan, sizeof(double)) == 0)
            return false;

        double negnan = -nan;
        if(std::memcmp(&n, &negnan, sizeof(double)) == 0)
            return false;
    }

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

编辑:具体来说,我正在寻找一种在语言中实现这一目标的方法,而不是依赖于编译器内部函数,先验定义或其他库,如boost.

c c++98

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

如何计算向量递归类型中的非空向量

我有一种类型,可以定义为矢量向量的矢量...整数类型的向量.例:

std::vector<std::vector<std::vector<std::vector< std::vector<signed char> > > > > _data;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种优雅的方法来确定更深层次的非空向量的数量.我可以使用像4这样的封装循环来做那个例子

for (it0 = data.cbegin() ; it0 != _data.cend() ; ++it0)
 for (it1 = *it0.cbegin() ; it1 != *it0.cend() ; ++it1)
   for (it2 = *it1.cbegin() ; it2 != *it1.cend() ; ++it2)
      for (it3 = *it2.cbegin() ; it3 != *it2.cend() ; ++it3)
          nonEmpty += (unsigned int) (*it3.empty());
Run Code Online (Sandbox Code Playgroud)

但是,我如何创建一个模板(支持向量,列表或任何类型的容器共享相同的API)功能,以便为任何深度(超过4级)执行此操作?我认为递归是正确的方法,但不知道如何使用Template ...

欢迎提供所有帮助和建议,因为我非常确定有多种解决方案.

c++ stl c++98

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

C++ 中具有所有同步方法的类

在Java中我们可以创建一个类

class Test {
    public synchronized void  fn1() {

    }

    public synchronized void  fn2() {

    }

    public synchronized void  fn3() {
        fn1(); // Calling another method
    }
}
Run Code Online (Sandbox Code Playgroud)

在 C++ 中,如果我想模仿功能,一种方法是

class Test {
    private:
        mutex obj;
    public:
       void fn1(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn1Helper();
            else
                unique_lock<mutex> lock(obj);
                fn1Helper();
        }

       void fn2(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn2Helper();
            else
                unique_lock<mutex> lock(obj);
                fn2Helper();
        }

        void fn3(bool calledFromWithinClass = false) {
            if(calledFromWithinClass) 
                fn3Helper();
            else {
                unique_lock<mutex> lock(obj);
                fn3Helper();
            } 
        }
    private: …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++98

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

不协调的向后typedef语法

所以我正在阅读关于lambda演算的模板元程序的实现,这是TMP图灵完备性的一个证明.

当我阅读源代码时,我偶然发现了一行(然后更多),如下所示:

template <int Name, typename Value, typename Env>
struct EnvLookup <Name, Binding<Name,Value,Env> > 
{
  Value typedef result ; // Line 84, what is this ?
} ;
Run Code Online (Sandbox Code Playgroud)

我已经习惯了typedef Type Alias;,但Type typedef Alias;对我来说却很陌生.而且它仍然可以用g ++ 4.9.0编写好的版本-std=c++98.

我在Google上找不到关于这种语法的任何文档,也没有关于SO的文档.这是否符合标准?也许是一个g ++扩展?它会融合吗 ?

c++ syntax typedef language-lawyer c++98

6
推荐指数
0
解决办法
44
查看次数

线程安全的 std::map:锁定整个映射和单个值

struct Data
{
 ...
 CRITICAL_SECTION valLock;
}    
std::map<int, Data> mp;
CRITICAL_SECTION mpLock;
Run Code Online (Sandbox Code Playgroud)

我目前正在使用两个关键部分来确保该线程安全。

我必须锁定两者mapData更新Data

//Lock mpLock
//Lock mp[key1].valLock
mp[key1].something = something_new;
//unlock mp[key1].valLock
//unlock mpLock
Run Code Online (Sandbox Code Playgroud)

我研究了英特尔的并发哈希图,它不需要两个锁并在内部处理这个问题。如果我不想使用英特尔的tbb,还有其他方法吗?我只有支持。不过c++ 98可以使用。boost调查过boost::shared_mutex,但无法关联如何在当前场景中使用它。

编辑:容器上的锁真的需要吗?我不能用来Data::valLock读/写Data。任何插入mp都不会影响现有的迭代器,因此不需要锁。任何删除mp都会以 开头Data::valLock。这里可能会错过什么情况?

编辑2:

UpdateThread()
{
   //Lock mp[key].valLock
   mp[key].a = b;         //Line 1
   //unlock mp[key].valLock
}

ReadThread()
{
    //Lock mp[key].valLock
   something = mp[key].a;   //Line 2
   //unlock mp[key].valLock
}
Run Code Online (Sandbox Code Playgroud)

所以我认为只有当第 1 行完成(或反之亦然)即已mp更新(以及地图内部结构)时,第 …

c++ multithreading boost c++98

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

标签 统计

c++98 ×10

c++ ×9

c++11 ×2

multithreading ×2

stl ×2

boost ×1

c ×1

constants ×1

language-lawyer ×1

linkage ×1

std ×1

syntax ×1

typedef ×1