小编Joh*_*0te的帖子

C/C++优化

在编程方面,我已经以非常优秀的方式成长,遗憾的是,高度优化的代码不是我的强项.我现在相当擅长C,通常可以用相当聪明的方式做事,但我仍然无法想出最优化的处理情况的方法.

一个例子是:

int strlen(const char* str)
{
    char* s;
    for (s=str; *s; ++s);
    return s-str;
}
Run Code Online (Sandbox Code Playgroud)

我自己也永远不会想到这一点.

那么,有什么好的资源可以让你看到像这样的优化代码?我想找一个我可以阅读它背后的理论的地方,编译器在后台做了什么让它变得有价值等等.

如果注意到一些资源用于研究优化数据结构以及应用于现实场景,那也是很好的,但这可能太多了.

c c++ compiler-construction

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

Sizeof空类

随着代码:

#include <iostream>

class A {};
class B { char x; };

int main()
{
    std::cerr << sizeof(A) << " " << sizeof(B) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我知道要问一个空课的大小是一个常见的面试问题 - 我知道答案是一个.

我的问题是......在一个空类的"1"字节中保存了什么(我猜它是空的),编译器在内部做了什么来使它sizeof Bsizeof A这种情况相同?

我想完全理解它,而不仅仅是知道答案.

c++

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

由于E_WARNING,我是否需要在PHP中尝试/捕获opendir?

我正在为家庭作业制作一个小文件浏览器 - 我的工作和我需要的一样好,但我现在有点困惑处理PHP中的错误情况,因为我正在尝试重构我的编码.

我习惯了C++/C#try/catch错误处理,PHP似乎有一些变种.令我困惑的是这个:

resource opendir(string $ path [,resource $ context])

成功时返回目录句柄资源,失败时返回FALSE.

如果path不是有效目录或由于权限限制或文件系统错误而无法打开目录,则opendir()将返回FALSE并生成级别为E_WARNING的PHP错误.您可以通过在函数名称的前面加上"@"来抑制opendir()的错误输出.

来自http://php.net/manual/en/function.opendir.php.

我是否需要捕获那里提到的级别E_WARNING生成的PHP错误,还是愚蠢的?我不明白为什么它会返回false并抛出一个错误 - 不应该抛出错误使它无论如何都不能正常返回?

php

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

C#中的SqlConnection - 安全编程实践

我在MSDN网站上找到了这个代码http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx:

private static void OpenSqlConnection(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
        Console.WriteLine("State: {0}", connection.State);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是......该网站还指出.Open()可以抛出InvalidOperationExceptions和SqlExceptions,但是这个示例看起来并不像它处理它们.

这只是因为他们对代码很简短,还是有理由不值得在这里处理?他们是否可能以某种方式使用使用结构?

.net c#

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

带有3个参数的Java8 stream.reduce() - 获得透明度

我编写了这段代码,将一个单词列表缩减为多少单词以'A'开头.我只是为了学习Java 8而写它,所以我想更好地理解它[免责声明:我意识到这可能不是编写这段代码的最好方法; 这只是为了练习!].

Long countOfAWords = results.stream().reduce(
    0L,
    (a, b) -> b.charAt(0) == 'A' ? a + 1 : a,
    Long::sum);
Run Code Online (Sandbox Code Playgroud)

中间参数/ lambda(称为累加器)似乎能够在没有最终'Combiner'参数的情况下减少完整列表.事实上,Javadoc实际上说:

{@code accumulator}函数充当融合映射器和累加器*,它有时比单独的映射和缩减更有效,*例如当知道先前减少的值允许您避免*某些计算时.

[编辑来自作者] -以下陈述是错误的,所以不要让它混淆你; 我只是把它放在这里,所以我不会破坏答案的原始背景.

无论如何,我可以推断累加器必须只输出组合器组合的1和0.我没有从文档中发现这一点特别明显.

我的问题

有没有办法在组合器执行之前查看输出是什么,所以我可以看到组合器组合的1和0的列表?这将有助于调试更复杂的情况,我相信我最终会遇到这种情况.

java reduce accumulate java-8 java-stream

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

Char Array VS Char*

这是一个基于问题答案的问题:

const char myVar*与const char myVar []

const char* x = "Hello World!";
const char  x[] = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

我现在了解不同之处,但我的新问题是:

(1)如果我重新分配x,第一行中的"Hello World"字符串会发生什么?在那一点上什么都没有指向它 - 当范围结束时它会被摧毁吗?

(2)除了常量之外,编译器中两个示例中的值如何以不同方式存储在内存中?

c++

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

Python,如何将32位整数放入字节数组中

我通常在C++中执行这样的操作,但我正在使用python编写一个快速脚本而且我遇到了一堵墙.

如果我有一个二进制列表(或任何python存储"fread"的结果).我可以使用:buffer [0],buffer [1]等访问其中的各个字节.

我需要更改字节[8-11]以保存新的32位文件大小(读取:那里已有文件大小,我需要更新它).在C++中,我只是得到一个指向该位置的指针并将其转换为存储整数,但是使用python我突然意识到我不知道如何做这样的事情.

如何在特定位置更新缓冲区中的4个字节以保存python中的整数值?

编辑

我将添加更多,因为我似乎无法从解决方案中找到它(虽然我可以看到它们在正确的轨道上).

首先,我在python 2.4(并且无法升级,大公司服务器) - 所以这显然限制了我的选择.很抱歉没有提及,我不知道它有这么多的功能.

其次,让我们做到这一点非常简单.

假设我有一个名为'myfile.binary'的二进制文件,其中包含十六进制的五字节内容'4C53535353' - 这相当于文件中单独的字母"L和4xS"的ascii表示.

如果我做:

f = open('myfile.binary', 'rb')
contents = f.read(5)
Run Code Online (Sandbox Code Playgroud)

内容应该(来自Sven Marnach的答案)保存一个五字节的不可变字符串.

仅使用Python 2.4工具,如何将'contents'中的4 S更改为任意整数值?即给我一行代码,可以使字节索引内容[1-4]包含值为12345678910的32位整数'myint'.

python

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

修改排列算法以防止重复打印输出的策略

我一直在审查练习算法,我现在正在研究一种我非常喜欢的置换算法:

void permute(char* set, int begin, int end) {
    int range = end - begin;

    if (range == 1)
        cout << set << endl;
    else {
        for(int i = 0; i < range; ++i) {
            swap(&set[begin], &set[begin+i]);
            permute(set, begin+1, end);
            swap(&set[begin], &set[begin+i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我实际上想将此应用于会有许多重复字符的情况,所以我需要能够修改它以防止打印重复的排列.

我如何检测我是否生成了重复内容?我知道我可以将它存储在散列或类似的东西中,但这不是最佳解决方案 - 我更喜欢不需要额外存储的解决方案.有人可以给我一个建议吗?

PS:我不想使用STL置换机制,我不想在某处引用另一个"唯一置换算法".我想了解用于防止重复的机制,以便在可能的情况下将其构建到学习中.

c++ algorithm permutation

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

使用inhertiance和polymorphism重载'<<'?

以下是代码外观的粗略示例,问题是如何让DerivedOne和DerivedTwo具有重载的<<运算符,但将这些对象存储在Base*的向量中.

至于我想要达到的目标; 我希望能够遍历对象向量并输出我在DerivedOne和DerivedTwo中告诉它的信息.

vector<Base*> objects;

class Base
{
 private:
 object Data
 public:
 object getData() { return Data; }
};

class DerivedOne : public Base
{
}

class DerivedTwo : public Base
{
}
Run Code Online (Sandbox Code Playgroud)

现在我知道有这个,但它不适用于我的目的.

friend ostream &operator<<(ostream &stream, Object object)
{
    return stream << "Test" << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance operator-overloading

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

等待阻塞集合(队列)在C#中减小

我正在使用以下工作流程开展项目:

第一部分:

  • 事件异步到达并在阻塞队列中排队,我们称之为Q1
  • 线程从该队列中获取下一个可用项
  • 项目最终并行运行{N}个任务
  • 每个任务将其结果排队到第二个队列,我们​​称之为Q2.
  • 处理完项目后,将从队列中读取下一个项目.

第二部分:

  • 另一个线程一次读取Q2一个对象并处理结果

因此,问题在于,第一个队列中的每个项目最终并行运行大量任务,并且每个任务将其结果排队.第二个队列必须连续处理,一次一个项目,然后它被淹没.


我的问题

我需要一种机制,使线程处理Q1等待,直到Q2中的项数低于特定的阈值.实现这一目标的最佳方法是什么?有没有办法让事件驱动的解决方案而不是轮询解决方案?

.net c# queue multithreading event-driven

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