小编Vor*_*rac的帖子

始终初始化所有变量

我正在阅读FreeBSD 编码风格并且非常喜欢它(因为我喜欢垂直紧凑的代码)。然而有这样的:

初始化所有变量
您应始终初始化变量。总是。每次。带有 -W 标志的 gcc 可能会捕获对未初始化变量的操作,但也可能不会。

理由
更多的问题最终会追溯到未初始化的指针或变量。

当变量没有合适的初始值时,不给它赋值不是更好吗?这样编译器可能会捕获未初始化的读取。我不是在谈论T *p = NULL,这是一个陷阱表示,可能(或可能不是)非常有用,而是int personal_number = 0 /* but 0 is a valid personal number!!*/


为了澄清,为了回应abasu的评论,我的例子试图说明没有可用的无效值的情况。我问了一个问题,得到的答案是使用不可能的值来标记错误或其他条件非常棒。但情况并非总是如此。例子很多:8位像素值、速度矢量等。


我可以看到“始终初始化变量”的一种有效替代方法是:

//logical place for declarations
T a;

/*code, for example to set up the environment for evaluating a*/

a = fooForA();

/*more code*/

fooThatUsesA(a);
Run Code Online (Sandbox Code Playgroud)

这样,如果忘记初始化,将会出现警告,并且错误将被修复,消除警告。

c coding-style

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

为什么在参数计数方面不是zip通用的?

Haskell新手在这里.我的观察是:

  • zip并且zip3是重要的功能 - 包含在前奏中,由许多其他语言实现,代表了数学中的常见操作(换位)

  • 在参数结构方面不通用

  • 易于用传统语言实现 - C或C++(比如20小时工作); python已经将它作为内置版本

为什么zip这么受限制?有抽象,概括吗?n大小的元组出了什么问题?

generics haskell

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

链接列表.在哪里分配以及如何应对碎片?

  • 地点
    • 在堆中,碎片化(每个节点的malloc) - 以几种不同的方式有效(缓慢分配,慢访问,内存碎片)
    • 在堆中,在一个大块中 - 当需要重新分配时,数据结构获得的所有灵活性都会丢失
    • 在堆栈中 - 堆栈的大小往往相当有限,因此根本不建议在其上分配大型结构

它们的巨大优势,即插入O(1),在碎片化内存的环境中看起来相当无用,并且数千次调用内存分配器给我们另外10个字节.


编辑澄清:
在一次采访中询问了这个问题.这不是一个工作场所的问题,所以通常的启发式方法是希望盲目地从一小组标准算法中找出正确的决策,这是不适用的.

现有的答案和评论提到"malloc不是那么慢","malloc部分地与碎片作斗争".好吧,如果我们使用另一种数据结构,例如C++向量的C端口(即 - 分配足够大小的顺序内存,如果数据扩展,重新分配到两倍大的块),所有问题都解决了,但我们放松了快速插入/删除.链接列表(分配在哪里?)的任何场景都具有对向量的巨大优势?

c memory-management

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

为什么在python中有这么多"保留的内置符号"-s

我正在学习Python.到目前为止filter,id和其他词语一起生成警告Warning: assignment to reserved built-in symbol.好吧,我正在设计过滤器并为每个分配id -s,这个警告迫使我在整个地方使用下划线.

C的保留关键字是缩短的单词,例如int或者不经常使用的英语单词,例如volatile.我如何应对Python编程语言的极端可读性,这迫使我使自己的程序不可读?

python keyword

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

为什么这是一个错误:static_cast <unsigned*>(&i)

通过遵循经验法则更喜欢static_castdynamic_cast在其他一切之前,我编写了以下程序:

int main(void)
{
    int i = 0;
    unsigned *j = static_cast<unsigned*>(&i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,它甚至没有编译:

$ g++ --std=c++11 test5.cpp 
test5.cpp: In function ‘int main()’:
test5.cpp:4:44: error: invalid static_cast from type ‘int*’ to type ‘unsigned int*’
     unsigned *j = static_cast<unsigned*>(&i);
                                            ^
Run Code Online (Sandbox Code Playgroud)

为什么这是错的?这种情况的正确演员是什么?

c++ casting

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

如何检测容器是否保证具有序列存储

检查序列容器是否在内存中是连续的.
仅接受某些类型的C++模板

我正在编写一个简单的send()方法,它在内部使用C风格的指针.我希望它能够使用所有保证的序列容器.我的动机是双重的:

  • 灵活的界面
  • 效率 - 使用std::array避免堆分配.

这是我有多远:

template <typename Container>
void poll( Container &out )
{
    static_assert( std::is_base_of< std::array<typename Container::value_type>, Container >::value  ||
                   std::is_base_of< std::vector<typename Container::value_type>, Container >::value ||
                   std::is_base_of< std::string<typename Container::value_type>, Container >::value,
                   "A contiguous memory container is required.");
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是,std::array需要第二个参数,并且在编译时无法知道.这个问题可以解决吗?可能采用不同的方法?

c++ containers stl c++11

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

有条件地初始化 const 的首选方法

初始化 const 自动变量的首选方法是什么?我能想到几个。

if 陈述:

const std::string s;
if( condition ) { const_cast<std::string&>(s) = "first"; }
else { const_cast<std::string&>(s) = "second"; }
Run Code Online (Sandbox Code Playgroud)

?: 操作员:

const std::string s = ( condition ) ? "first" : second;
Run Code Online (Sandbox Code Playgroud)

立即调用函数表达式:

const std::string s = [ & ] () 
    { if( condition ) return "first" else return "second" } ();
Run Code Online (Sandbox Code Playgroud)

initialization constants c++11

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

如何防止constexpr功能的意外发射

Ben Deane提到了throw技巧,它确保在非constexpr上下文中使用constexpr函数时出现链接错误.

这是我的看法:

#include <iostream>

struct Exc;

constexpr int foo( int a )
{
    if( a == 42 )
    {
        throw Exc{};
    }

    return 666;
}


int main()
{
    constexpr auto ret = foo(43);
    std::cout << ret << "\n";

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

但我无法使它工作(clang ++ 3.8.1-23和g ++ 6.3.0):

$ clang++ -std=c++14  main.cpp 
main.cpp:9:15: error: invalid use of incomplete type 'ExcBase'
        throw ExcBase{};
              ^~~~~~~~~
main.cpp:3:8: note: forward declaration of 'ExcBase'
struct ExcBase;
       ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

这个帖子中的评论暗示了另一个技巧:

#include <iostream> …
Run Code Online (Sandbox Code Playgroud)

constexpr c++14

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

python3中的可迭代类

我正在尝试为Web资源(延迟获取的图像)实现可迭代的代理。

首先,我做到了(返回id,在生产中,这些将是图像缓冲区)

def iter(ids=[1,2,3]):
    for id in ids:
        yield id
Run Code Online (Sandbox Code Playgroud)

效果很好,但现在我需要保持状态。

我阅读了定义迭代器的四种方法。我判断迭代器协议是要走的路。跟随我的尝试和失败,以实现这一目标。

class Test:
    def __init__(me, ids):
         me.ids = ids
    def __iter__(me):
        return me
    def __next__(me):
        for id in me.ids:
            yield id
        raise StopIteration

test = Test([1,2,3])
for t in test:
    print('new value', t)
Run Code Online (Sandbox Code Playgroud)

输出:

new value <generator object Test.__next__ at 0x7f9c46ed1750>
new value <generator object Test.__next__ at 0x7f9c46ed1660>
new value <generator object Test.__next__ at 0x7f9c46ed1750>
new value <generator object Test.__next__ at 0x7f9c46ed1660>
new value <generator object Test.__next__ …
Run Code Online (Sandbox Code Playgroud)

python iterator iterable python-3.x

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

如何只为我的IP启用php调试消息?

我与实验php的上apache的学习体验服务器.由于不愿意设置生产和开发服务器,我被指导/etc/php5/apache2/php.ini应该用于启用警告.

我想只在从特定IP访问apache服务器时启用调试消息:我的外部IP.怎么能实现这一目标?

php

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