小编xav*_*sjs的帖子

std :: thread通过引用调用复制构造函数

我有一个使用std :: thread将数据传递到线程的问题.我以为我理解了复制构造函数等的一般语义,但似乎我并没有完全理解这个问题.我有一个名为Log的简单类,它隐藏了它的复制构造函数:

class Log
{
public:
    Log(const char filename[], const bool outputToConsole = false);
    virtual ~Log(void);

    //modify behavior
    void appendStream(std::ostream *);
    //commit a new message
    void commitStatus(const std::string str);

private:
    //members
    std::ofstream fileStream;
    std::list<std::ostream *> listOfStreams;

    //disable copy constructor and assignment operator
    Log(const Log &);
    Log & operator=(const Log &);
}
Run Code Online (Sandbox Code Playgroud)

现在我主要基于http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp

int main()
{
    static int portNumber = 10000;

    Log logger("ServerLog.txt", true);
    logger.commitStatus("Log Test String");

    try {
        boost::asio::io_service ioService;
        server(ioService, portNumber, logger);
    }
    catch (std::exception &e)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading copy-constructor c++11 stdthread

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

Android JNI本机代码中的C++对象是否会调用垃圾回收?

所以,我有一个概念性的问题.我一直在Android上使用JNI来处理低级音频"东西".我已经用C/C++完成了大量的音频编码,所以我认为这不是什么大问题.我决定在我的"原生"代码中使用C++(因为谁不喜欢OOP?).我遇到的问题似乎(对我来说)是一个奇怪的问题:当我在C++代码中创建一个处理音频的对象时,我从未将此对象传递给Java(也没有其他方式),调用此方法对象似乎经常调用垃圾收集.由于这是在音频回调中发生的,结果是口吃的音频,我得到频繁的消息:

WAIT_FOR_CONCURRENT_GC blocked 23ms
Run Code Online (Sandbox Code Playgroud)

但是,当我通过创建静态函数(而不是在memeber对象上调用成员方法)执行相同的操作时,应用程序的性能似乎很好,我不再看到上面的日志消息.

基本上,是否有任何理由调用静态函数应该比在本机代码中的成员对象上调用成员方法具有更好的性能? 更具体地说,是成员对象还是完全位于垃圾收集中涉及的JNI项目的本机代码内的有限范围变量?GC中涉及C++调用堆栈吗?在JNI编程方面,有没有人可以告诉我C++内存管理如何满足Java内存管理?也就是说,如果我没有在Java和C++之间传递数据,那么我编写C++代码的方式是否会影响Java内存管理(GC或其他方式)?

请允许我举一个例子.忍受我,因为它很长,如果你认为你有洞察力,欢迎你不要在这里阅读.

我有几个对象.一个负责创建音频引擎,初始化输出等.它被称为HelloAudioJNI(抱歉没有编译可编译的例子,但有很多代码).

class CHelloAudioJNI {

    ... omitted members ...

    //member object pointers
    COscillator *osc;
    CWaveShaper *waveShaper;

    ... etc ...

public:
    //some methods
    void init(float fs, int bufferSize, int channels);

    ... blah blah blah ...
Run Code Online (Sandbox Code Playgroud)

接下来我还有几节课.WaveShaper类看起来像这样:

class CWaveShaper : public CAudioFilter {
protected:
    double *coeffs;
    unsigned int order;//order
public:
    CWaveShaper(const double sampleRate, const unsigned int numChannels,
                double *coefficients, const unsigned int order);

    double processSample(double input, unsigned int channel);
    void reset();
};
Run Code Online (Sandbox Code Playgroud)

现在让我们不要担心CAudioFilter类,因为这个例子已经很长了.WaveShaper .cpp文件如下所示:

CWaveShaper::CWaveShaper(const …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface garbage-collection android-ndk

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

在执行bcp之后构建依赖的boost库

所以我使用了一组boost库,但是包含文件的绝对数量使得检查一个干净的副本真的很慢.我敢肯定大多数使用svn的boost的人已经注意到了这一点.我google了一会儿,从boost中找到一个很好的实用程序,bcp它只会将依赖的头文件复制到我指定的目录中.所以,我想要做的是在svn中提供最少数量的头文件,并允许开发人员根据需要编译所有内容.第一步是复制必要的头文件并检查所有必要的预编译库.下一步是抛弃预编译的库,并使其成为我正在为我的项目使用的任何构建系统的预构建步骤(在我的情况下,Visual Studio,但make也会非常好).我的问题是这个

有人知道如何构建标题子集所需的库吗?

我正在按照这个方针做一个bcp

bcp.exe --scan C:\path\to\my\files\main.cpp C:\path\to\my\files\someOtherCppFilesToo.cpp C:\path\to\reduced\boost
Run Code Online (Sandbox Code Playgroud)

互联网似乎认为我可以做这样的事情

cd C:\path\to\reduced\boost
bootstrap.exe
b2.exe
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法弄清楚是否有某种方法可以复制compile/bootstrap/jam /无论配置如何,以便boost.build和bootstrap知道如何配置/编译所有内容.我显然不想从boost目录中复制每个文件,因为这会破坏减少boost包含的整个目的.

boost bootstrapper boost-build

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

如果在c中的结构内定义,枚举可以限制范围

我想知道枚举是否可以通过将它放在结构中来限制它的访问方式.我知道这可以在C++中工作(这就是我得到的想法),但我不知道它是否适用于c.所以,例如,如果我有两个不同的结构

struct SaticArrayA
{
    enum { MAX_SIZE = 10 };
    int array[MAX_SIZE];
};
struct SaticArrayB
{
    enum { MAX_SIZE = 20 };
    int array[MAX_SIZE];
};
Run Code Online (Sandbox Code Playgroud)

这甚至接近编译?基本上,我想做我将在C++中做的事情并给自己一个跨"类"的通用命名约定,以便我可以询问任何数组的大小是什么,等等.

(ps我本质上是想在c中给自己一个更好的静态数组,它不会丢失大小信息(通过衰减到指针)第二次我尝试将它传递给另一个范围).

c enums struct scope namespaces

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

如何在python中将修饰的拉丁文unicode字符转换为普通拉丁文

Unicode指定了您可以对拉丁字符进行的一系列修改。如何在python中将这些unicode字符转换为香草拉丁字符?

明确地说,我不是在问如何摆脱字母的重音。我要问的是,如何转换在语言上具有相同含义的东西,但是某些修饰的显示(例如底片,环绕,封闭在盒子类型的显示中)。

例如,如何转换

°°c

°原始°c

(剥离这些非语言字符将是一个单独的任务)

python unicode

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

签名/未签名的特质编程

我开始学习c ++中的特征和模板.我想知道的是可以为有符号/无符号整数类型创建模板.我们的想法是,可能(可能)为烧结的整数类型实现普通类,以及无符号整数类型的变体.我试过了:

template <typename T>
class FXP<T>
{ ... };

template <typename T>
class FXP<unsigned T>
{ ... };
Run Code Online (Sandbox Code Playgroud)

但这不编译.

我甚至遇到过:

std::is_integral

std::is_signed
std::is_unsigned
Run Code Online (Sandbox Code Playgroud)

那么,我如何将它们用于定义仅支持这两种变体的类呢?

c++ templates type-traits c++11

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

sizeof静态数组成员返回指针的大小而不是数组

所以我有一个C++结构,它有一个静态数组作为成员,我想在构造函数中询问它的大小.正如我从本文http://msdn.microsoft.com/en-us/library/4s7x1k91(VS.71).aspx所理解的那样,sizeof可以应用于静态数组以查找整个大小(以字节为单位)数组,而不仅仅是它的类型.但是,当我sizeof()对成员执行时,它给出了4(指针的大小)而不是数组的大小.这是上下文(平凡的):

struct A
{
    char descirption[128];
    int value;

    A(const char desc[], int val)
    {
        size_t charsToCopy = std::min(sizeof(description), sizeof(desc));
        memcpy(description, desc, charsToCopy);
        value = val;
    }
}

int main()
{
    A instance("A description string", 1);
    //now instance has a description string that says "A des" followed by garbage characters
}
Run Code Online (Sandbox Code Playgroud)

那么我如何获得成员char数组的大小?

编辑

当我在编译器中放置一个断点并检查这两个值时sizeof(description),sizeof(desc)我看到了sizeof(description) == 4,和sizeof(desc) == 21.因此我的困惑.因为我正在将一个字符串文字传递给构造函数,所以编译器似乎很高兴告诉我传入的字符串的实际大小.如果我将它分配给某个地方的某个变量,可能就不会这样了,但是现在我我试图追查根本问题:sizeof(some-member-static-array)给了我一些(相对)毫无意义的东西.

sizeof是否可能正在进行某种字符串长度测量,因为它是一组字符?

c++ arrays sizeof static-array

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

从命令行c ++发送文本文件名

我想运行我的代码并以两种方式发送我的文件

  1. myprogram < input.txt 要么 cat input.txt | myprogram
  2. myprogram input.txt

我已经找到了使用的方式argc,argv[]但我无法弄清楚如何编写第一个选项的代码.

int main (int argc, char *argv[])
{
     ifstream fin;
     if(argc > 1){

        fin.open (argv[1]);
     }
     else
}
Run Code Online (Sandbox Code Playgroud)

c++ command-line file c++11

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