小编Joh*_*ohn的帖子

sizeof有两个论点

在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为

char arr[100];
Run Code Online (Sandbox Code Playgroud)

sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.

我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)sizeof(char*).两个sizeof(0, arr)sizeof(arr)100在C++中.

在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.


编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?

c c++ arrays pointers comma-operator

37
推荐指数
5
解决办法
2333
查看次数

thread_local的成本

现在C++正在添加thread_local存储作为语言功能,我想知道一些事情:

  1. thead_local可能的成本是多少?
    • 在记忆中?
    • 用于读写操作?
  2. 与此相关:操作系统通常如何实现这一点?看起来任何声明的东西thread_local都必须为每个创建的线程提供特定于线程的存储空间.

c++ thread-local-storage

16
推荐指数
2
解决办法
3376
查看次数

使用-std = c ++ 11是否会破坏二进制兼容性?

我很难看到这个问题 - 这似乎是一个很明显的问题 - 但是我还没有找到它:用"-std = c ++ 11"(g ++)二进制文件编译的模块是否与未编译的模块兼容有选项吗?(也就是说,我可以安全地将它们链接在一起吗?)两个编译都将使用完全相同的g ++版本.

更准确地说,使用gcc 4.9.0,我只能在特定的编译单元上使用"-std = c ++ 11",然后让其他编译器没有选项进行编译.

c++ g++ c++11

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

Segfault:objdump和gdb之间的反汇编是不同的

[深呼吸.]我们有一个使用WxMotif 2.6.3弹出窗口的应用程序(GUI库不是 - 而不是 - 我的选择).它在32位ix86系统上运行良好.我的任务是将其转换为64位应用程序.它始终是错误的.我在RHEL 6上,所以我使用gcc 4.4.7编译.在咬牙切齿之后,问题显而易见:在wxFrame :: DoCreate中,m_mainWidget被设置(正确); 在wxFrame :: GetMainWidget中,它作为空指针返回.空指针导致崩溃.使用gdb,设置m_mainWidget的指令是

mov    %rax,0x1e0(%rdx) # $rdx = 0x68b2f0
Run Code Online (Sandbox Code Playgroud)

而获取m_mainWidget的代码是

mov    0x1f0(%rax),%rax # $rax = 0x68b2f0
Run Code Online (Sandbox Code Playgroud)

在gdb中,我可以检查内存并看到0x68b4d0处的指针是正确的.为什么偏移不正确?

为了使事情更加混乱,当我使用objdump来反汇编libwx_motifd_core-2.6.so.0.3.1时,"get"程序集是

  mov    0x1e0(%rax),%rax
Run Code Online (Sandbox Code Playgroud)

在objdump中,get和set都使用0x1e0作为偏移量.到底是怎么回事?

我在这里上传了一些相关信息: GitHub

我已经包含了一个小程序,可以在我的系统上复制问题.

进一步研究,我在wxFrame :: DoCreate的反汇编中看到,进一步使用m_mainWidget使用0x1e0作为偏移量检索值(反汇编是在我使用-O0的编译中,所以代码必须返回内存每一次)."Just for Fun",我向wxFrame添加了一个新的成员变量 - m_myMainWidget - 并在设置m_mainWidget后立即设置它.然后我让wxFrame :: GetMainWidget()返回本地值(m_myMainWidget).你不知道吗:崩溃仍然发生,当我从gdb中反汇编时,GetMainWidget包含相同的+16偏移量.(偏移不在那里我使用objdump进行反汇编.)

c++ assembly gdb objdump

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

内部类型作为模板参数

ISO 98/03标准(第14.3.1节)似乎禁止使用具有内部链接的类型作为模板参数.(参见下面的示例.)C++ 11标准没有.G ++ - 使用旧标准 - 允许它.我误读了03标准,还是g ++只是让这个幻灯片?

namespace
{
    struct hidden { };
}

template<typename T>
struct S
{
   T t;
};

int main()
{
    S<hidden> s;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

C++中的整数除法11

我注意到对C++ 11第5.6节的一些措辞更改.(我正在查看C++标准N3242草案,日期为2011-02-28.)新(草案)标准包括以下句子:

"对于积分操作数,/运算符产生代数商,丢弃任何小数部分;"

这个陈述不是03标准的5.6(ISO-IEC-14882-2003),但我不认为这是一个改变,是吗?这就是C和C++多年来的工作方式,除非我已经失去了理智(无论如何可能已经发生过).

c++ c++11

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

静态变量的动态初始化阶段

该标准明确规定静态持续时间变量(命名空间范围和类静态成员)的动态初始化不必在执行main之前发生:"无论动态初始化是否为实现定义(8.5,9.4,12.1,12.6. 1)命名空间作用域的对象是在main的第一个语句之前完成的." IS 3.6.2(3)不是如何实现动态初始化[总是?]?有什么更好/更简单的方法可以保证在使用前初始化对象?

c++

5
推荐指数
2
解决办法
2721
查看次数

功能过载解决问题

在周末,我遇到了功能超载分辨率的具体问题,我似乎无法解决.下面的代码是问题的提炼:

#include <iostream>
using namespace std;

template<typename T>
void f(const T& t)
{
    cout << "In template function." << endl;
}

class C
{
public:
    void f() { cout << "In class function." << endl; }
    void g() { int i=0; f(i); }
    void h() { int i=0; f<int>(i); }
    void i() { extern void f(int); int i=0; f(i); }
};

int main()
{
    cout << "Test" << endl;
    C c;
    c.i();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1)C :: g将无法编译,因为编译器不会尝试模板.它只是抱怨没有C :: f匹配. …

c++

5
推荐指数
1
解决办法
159
查看次数

Clang 3.1和用户定义的文字

Clang 3.1声称支持用户定义的文字.我可以定义这个:

int operator"" _tryit(long double n) { return int(n); }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它时,我收到一个错误:

int m = 5_tryit;
Run Code Online (Sandbox Code Playgroud)

'_tryit'整数常量的后缀无效

c++ clang xcode4 c++11

5
推荐指数
1
解决办法
744
查看次数

帮助模板专业化

我正在使用/学习模板功能专业化规则.我从这个功能开始

template<typename T>
std::string toString(const T& t)
{
    ostringstream out;
    out << t;
    return out.str();
}
Run Code Online (Sandbox Code Playgroud)

现在我想把它专门用于const char*

typedef const char* ccharPtr;

template<>
std::string toString(const ccharPtr& s)
{
    cout << "in specialization" << endl; // just to let me know
    return std::string(s);
}
Run Code Online (Sandbox Code Playgroud)

我想在没有typedef的情况下这样做,但到目前为止我无法理解.

该特化适用于const char*,但不适用于char*.

const char* s1 = "Hi"
cout << toString(s1); // works
char s2[] = "There";
cout << toString(s2); // doesn't work, since s2 isn't const char*
cout << toString(", Bob"); // doesn't work. Why not? …
Run Code Online (Sandbox Code Playgroud)

c++ templates

4
推荐指数
2
解决办法
1469
查看次数