小编jw.*_*jw.的帖子

int x ='fooo'是编译器扩展吗?

我已经看到并使用了如下的C++代码:

int myFourcc = 'ABCD';
Run Code Online (Sandbox Code Playgroud)

它适用于最近的GCC版本,不知道最近的版本.这个功能是否在标准中?这叫什么?

我在网上搜索时遇到了麻烦......

编辑:

对于未来的观察者,我也发现了这些信息:

来自gcc文档

编译器一次为一个字符定义一个多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到目标宽度的新字符的位模式中输入字符.最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同).如果常量中的字符数多于目标int中的字符数,则编译器会发出警告,并忽略多余的前导字符.

例如,具有8位字符的目标的'ab'将被解释为(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')', and '\234a' as(int)((unsigned char)'\ 234'*256 +(unsigned char)'a')'.

c c++ gcc

4
推荐指数
3
解决办法
1017
查看次数

const float&x = something; //认为有害吗?

有一些像这样的代码:

// Convenience to make things more legible in the following code
const float & x = some.buried.variable.elsewhere;

// Go on to use x in calculations...
Run Code Online (Sandbox Code Playgroud)

我被告知"const float&"是"坏",应该只是一个普通的浮点数或常量浮点数.

然而,除了"你不必输入'和'"之外,我无法想到一个令人信服的理由.

事实上,在我看来,在某些情况下原始可能更好,因为编译器可能不会为变量分配额外的堆栈空间.

换句话说,最初我可以有效地说:

assert(&x == &some.buried.variable.elsewhere)
Run Code Online (Sandbox Code Playgroud)

而在第二种情况下我不能.

此外,在我看来,原始似乎更好地传达意图,因为引用的整个要点是为另一个值创建别名.

任何人都可以举例说明"const float&"版本在某种有形方面比普通的"浮动"或"常量浮动"更糟糕吗?

c++ reference

4
推荐指数
1
解决办法
5554
查看次数

C++ empty-paren成员初始化 - 将内存清零?

我最初写了一些像这样的代码:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)

比我更聪明的人说使用m_buffer()初始化程序会将内存清零.我的意图是保持记忆不被初始化.我没有时间进一步讨论它,但它激起了我的好奇心.

以前,我曾认为总是在初始化列表中列出每个成员是明智的.

有人可以进一步描述这种行为吗?

1)为什么empty-paren初始化程序会填充内存?

2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便.

谢谢

c++ standards initialization

3
推荐指数
1
解决办法
1275
查看次数

Monitor.Wait/Pulse的使用是否有竞争条件?

我有一个简单的生产者/消费者场景,其中只有一个项目被生产/消费.此外,生产者在继续之前等待工作线程完成.我意识到这种情况可以避免多线程的全部问题,但请假设它真的需要这样(:

这段代码不能编译,但我希望你能得到这个想法:

// m_data is initially null

// This could be called by any number of producer threads simultaneously
void SetData(object foo)
{
    lock(x)                      // Line A
    {
        assert(m_data == null);
        m_data = foo;
        Monitor.Pulse(x)         // Line B
        while(m_data != null)
            Monitor.Wait(x)      // Line C
    }
}

// This is only ever called by a single worker thread
void UseData()
{
    lock(x)                      // Line D
    {
        while(m_data == null)
            Monitor.Wait(x)      // Line E
        // here, do something with m_data
        m_data …
Run Code Online (Sandbox Code Playgroud)

c# multithreading monitor race-condition pulse

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