小编And*_*san的帖子

为什么GCC不优化结构?

系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.

我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?

我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).

c optimization gcc struct

46
推荐指数
4
解决办法
9205
查看次数

如何使用布尔参数为按位运算符启用C++警告

在Linux上使用相当大的C++代码库和GCC工具链时,我遇到了执行布尔检查的代码,如下所示:

#include <stdio.h>

int main() {
   bool foo = true;

   if (~foo) {
     // do some expensive operation
     printf("This can be bad...\n");
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这看起来像一个明显的错误,因为~运算符在C++中表示逐位NOT,而不是逻辑NOT,就像在MATLAB中那样.上面的代码总是评估为true

幸运的是,这个错误造成的问题不是很重要(这只是一个小小的性能损失),但它让我想到如何在这么多时间内找不到这个错误.

由于逐位运算符触发从布尔值到整数的隐式转换(这是一个促销),因此它本身没有任何问题.然而,对我而言,似乎至少clang-tidy应该能够将其视为逻辑错误,因为很明显,在大多数情况下,意图不是对bool应用逐位操作,而是而是一个逻辑的.

g++即使-Wall -Wextra -Wconversion启用也似乎并不关心这个问题,这是明智的,因为正如我之前提到的,这不符合标准.(我甚至试过g++6.3,它应该有很多新的检查,但仍然没有任何结果

使用clang-tidy所有启用的检查(真的很快就会变得嘈杂)会警告隐式转换本身("隐式转换bool - >'int'"),但似乎没有与应用bit-相关的特定警告聪明的操作员到布尔.

以不同的方式编写if语句if(~foo == true),虽然详细并导致始终为false的情况,但确实会导致更有意义的错误,从而引起注意,但是在使用terser if(~foo)表单时不会发生这种情况.

是否有任何方法/工具来检查这些问题,这些问题是100%正确的C++,但很可能是错误?

c++ static-analysis bit-manipulation

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

为什么PyMongo会抛出AutoReconnect?

在研究我的Python Web应用程序的一些奇怪问题时(特别是有关MongoDB连接的问题),我在官方PyMongo文档页面上注意到了一些问题.我的Web应用程序使用Flask,但这不应该影响我面临的问题.

PyMongo驱动程序执行连接池,但是AutoReconnect当连接失效并且重新连接到期时,它也会抛出异常().

它声明(关于AutoReconnect异常):

为了自动重新连接,您必须处理此异常,并认识到导致它的操作未必成功.将来的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到第一次成功建立连接).

我注意到这实际上经常发生(并且它似乎不是一个错误).MongoDB服务器在几分钟不活动之后关闭连接,并且需要由Web应用程序重新创建.

我不明白为什么PyMongo驱动程序重新连接时会抛出错误(驱动程序的用户需要自己处理),而不是透明地执行.(甚至有可能是一个选项,用户可以设置使AutoReconnect异常抛出,但将不是一个合理的默认是这些异常没有得到根本抛出,以及连接无缝重现?)

我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑.

还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我假设它与本地连接的事实有关,并且连接是通过UNIX套接字而不是通过UNIX套接字完成的一个网络套接字,但我可能是错的).

python mongodb pymongo

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

OpenJDK实现System.arraycopy

在关于JVM基于char []实现字符串创建的方式的问题之后,我已经提到当char []被复制到新字符串的内部时不会发生迭代,因为最终会调用System.arraycopy,它使用诸如memcpy之类的函数在原生的,依赖于实现的级别(原始问题)复制所需的存储器.

我想亲自检查一下,所以我下载了Openjdk 7源代码并开始浏览它.我在OpenJDK C++源代码中找到了System.arraycopy的实现,在openjdx/hotspot/src/share/vm/oops/objArrayKlass.cpp:

if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
  // elements are guaranteed to be subtypes, so no check necessary
  bs->write_ref_array_pre(dst, length);
  Copy::conjoint_oops_atomic(src, dst, length);
} else {
  // slow case: need individual subtype checks
Run Code Online (Sandbox Code Playgroud)

如果元素不需要类型检查(例如原始数据类型数组的情况),则调用Copy :: conjoin_oops_atomic.

Copy::conjoint_oops_atomic函数位于'copy.hpp'中:

// overloaded for UseCompressedOops
static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) {
  assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong");
  assert_params_ok(from, to, LogBytesPerInt);
  pd_conjoint_jints_atomic((jint*)from, (jint*)to, count);
}
Run Code Online (Sandbox Code Playgroud)

现在我们依赖于平台,因为复制操作具有基于OS /体系结构的不同实现.我将以Windows为例.openjdk\hotspot\src\os_cpu\windows_x86\vm\copy_windows_x86.inline.hpp: …

c++ java openjdk jvm

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

Azure网站的自定义部署

我最近开始使用Gulp.js将我的所有CSS和JavaScript打包成单个文件,然后将其包含在我的Web应用程序中.我的网络应用程序是用Python编写的(使用Flask).

我显然不想使用git跟踪Gulp输出CSS和JS文件(因为它们是构建输出文件).

我使用push to deploy将我的网站部署到Azure网站.也就是说,我只是运行git push azure master,Azure自动确定我正在使用Python,设置virtualenv,安装pip依赖项等等.本文介绍如何进行此设置.

这个过程很有效,但是现在我已经开始使用Gulp,我想确保每当我部署网站时,也会在服务器端生成连接的JavaScript和CSS文件.

此外,在将来,我希望Azure在部署时运行所有测试,并且只有在它们全部通过时才能成功部署.

遗憾的是,我还没有为此工作流找到令人满意的解决方案,因为我无法为Azure的自动部署过程添加自定义步骤.

我曾尝试使用Kudu编写自定义部署脚本(正如此博客文章所建议的那样),但这样做会禁用Azure通常执行的所有自动步骤; 运行azure site deploymentscript --python只生成一个非常基本的Kudu部署文件,该web.config文件不处理文件中的读取,设置virtualenv或安装依赖项.我自己没有找到关于如何做到这一点的文件; 我使用默认的自动Azure部署脚本(当我推送代码时会生成服务器端,所以我自己无法访问它),因为不会处理像virtualenv和pip依赖项这样的东西.

有没有可用的解决方法,以便我可以自定义我的部署脚本(例如运行Gulp),同时仍然正确部署Flask?

python deployment automation azure gulp

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

Python 中前向替换的数值稳定性

我正在用 Python 实现一些基本的线性方程求解器。

我目前已经实现了三角方程组的前向和后向替代(因此求解起来非常简单!),但即使对于大约 50 个方程组(50x50 系数矩阵),解的精度也会变得非常差。

以下代码执行前向/后向替换:

FORWARD_SUBSTITUTION = 1
BACKWARD_SUBSTITUTION = 2
def solve_triang_subst(A: np.ndarray, b: np.ndarray,
                       substitution=FORWARD_SUBSTITUTION) -> np.ndarray:
    """Solves a triangular system via
    forward or backward substitution.

    A must be triangular. FORWARD_SUBSTITUTION means A should be
    lower-triangular, BACKWARD_SUBSTITUTION means A should be upper-triangular.
    """
    rows = len(A)
    x = np.zeros(rows, dtype=A.dtype)
    row_sequence = reversed(range(rows)) if substitution == BACKWARD_SUBSTITUTION else range(rows)

    for row in row_sequence:
        delta = b[row] - np.dot(A[row], x)
        cur_x = delta / A[row][row]
        x[row] …
Run Code Online (Sandbox Code Playgroud)

python floating-point numpy numerical-methods

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

(Python)YouCompleteMe忽略了我的代码和pip包

我在MacVim上使用YouCompleteMe(OSX 10.9.4上的vim 7.4)用于Python代码自动完成.

YCM在引用Python内置功能(如os.*东西)时工作得很好,但它似乎无法自动完成由我或使用pip安装的各种软件包编写的标识符.

根据其文档,YouCompleteMe使用Jedi完成Python代码,Jedi GitHub页面明确指出Jedi可以自动完成任何代码,而不仅仅是标准库标识符.

有没有人知道为什么绝地没有拿起任何包或自定义代码?

python vim macvim vim-plugin

5
推荐指数
0
解决办法
477
查看次数

声明主方法同步

我看到一个 Java 示例,其中有一个 main 方法标记为 synchronized,调用另一个静态同步方法。结果是,基本上,其他方法仅在主方法返回后才在单独的线程上运行。

这样的构造有什么实际功能?

public class SynchronisedMain {

    public static synchronized void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                thingy();               
            }
        }).start();
        System.out.println("Kickstarted thingy thread.");
        TimeUnit.MILLISECONDS.sleep(1000);
    }

    public static synchronized void thingy() {
        System.out.println("Thingy!");
    }
}
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading

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

C++ hash_map,带有非专用模板作为值

我希望有一个std::hash_map映射(例如)常规std:strings到另一个模板类的多个不同的特化.

这个例子就是我想要实现的(虽然它是错误的但不编译):

template<typename T>
class Foo {
public:
  Foo(T _value)
  {
    this-> value = _value;
  }

private:
  T value;
};

int main() 
{
  hash_map<string, Foo> various_foos;
  various_foos["foo"] = Foo<int>(17);
  various_foos["bar"] = Foo<double>(17.4);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates hashmap

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

C++:编译一些代码所需的转发类定义

我正在用C++编写一个小游戏作为练习,我遇到了一个难题.其基本思路是,Level有一个vectorEntity,每个Entity实例都知道它属于哪个级别.到目前为止非常简单.

我在我的Entity类中得到了一些讨厌的编译错误,因为它无法弄清楚是什么Level.一个简单的前向类声明就在声明之前Entity轻松修复了.但是,我已经"Level.h"加入了"Entity.h".和LevelEntity均声明并在相同的命名空间中定义.

注意:Entity.h还包括Level.h.

#include "Level.h"

namespace GameNS {

  // Required, otherwise the compiler complains
  class Level;

  class Entity
  {
  public:
  ...
Run Code Online (Sandbox Code Playgroud)

当编译器Level到达时,编译器是否应该知道它是Entity什么?

c++ forward-declaration visual-c++

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

触发错误:= ORA-04079:触发器规范无效

触发错误:= ORA-04079:触发器规范无效

导致该错误的代码如下:

CREATE OR REPLACE TRIGGER TRGBILLINGADDRESS 
AFTER INSERT OR DELETE OR UPDATE ON TBLMACCOUNTADDRESS 
    add1 wom.tbltaddress.address1%TYPE;
    add2 wom.tbltaddress.address2%TYPE;
    cityid wom.tbltaddress.city_id%TYPE;
    stateid wom.tbltaddress.state_id%TYPE;
    pincd wom.tbltaddress.pincode%TYPE;
BEGIN
   SELECT address1,address2,city_id,state_id,pincode
          INTO add1,add2,cityid,stateid,pincd  FROM wom.tbltaddress ta  WHERE ta.ID IN (
          SELECT vbac.billing_address_id
          FROM wom.vw_billaddresschange vbac, wom.tbltaddress ita
          WHERE vbac.billing_address_id = ita.ID
          AND vbac.lcid = parlcid);
   IF add1 = :NEW.address1 AND add2 = :NEW.address2 AND  cityid = :NEW.cityid AND  stateid = :NEW.stateid AND  pincode = :NEW.zip THEN            
          dbms_output.put_line('Address Already Exist in tbltaddress table'); …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

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

混合VBO和非VBO渲染的Opengles给出了EXC_BAD_ACCESS

大家好.我试图渲染下面显示的两种方法.RenderA()使用VBO而RenderB()不是.我在RenderB()中到达glDrawArrays()时得到一个EXC_BAD_ACCESS错误.

如果我不创建和使用任何VBO,即当我注释掉CreateVBOs()和RenderA()时,RenderB()工作正常.

  1. 这是否意味着一旦开始使用VBO,所有渲染都必须使用VBO?
  2. 或者我在这里做错了什么?
Render() { 
    CreateVBOs(); //glGenBuffers,glBindBuffer,glBufferData etc        
    RenderA();       
    RenderB();
    }

RenderA(){           
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo->indexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vbo->vertexBuffer);

    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0);
    glColorPointer(4, GL_FLOAT, sizeof(Vertex), colorOffset);   

    glEnableClientState(GL_VERTEX_ARRAY);   
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawElements(GL_TRIANGLES,vbo->indexCount, GL_UNSIGNED_SHORT, bodyOffset);

    glDisableClientState(GL_COLOR_ARRAY);   
    glDisableClientState(GL_VERTEX_ARRAY);
}

RenderB(){
    static GLfloat vertices[] = {1.0,1.0,1.0,2.0,1.0,1.0};

    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, vertices);

    glDrawArrays(GL_POINTS, 0, 2);

    glDisableClientState(GL_VERTEX_ARRAY);
}

编辑(解决)

弄清楚了.显然你必须确保解除缓冲区的绑定,如果它之前是绑定的,以便在没有vbo的情况下进行渲染.

我的CreateVBOs()函数绑定但没有取消绑定缓冲区,以便在RenderB()尝试使用glDrawArrays时创建错误访问.取消绑定缓冲区只是将它绑定到0,如下所示:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

c++ opengl rendering vbo

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

构造向量c ++后无法释放指针

我需要从我从另一个函数获得的char**变量填充一个vector变量.

我自己尝试了以下程序:

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
char** getS();
int main()
{
    int i;
    vector<string> a;
    cout << "Hello World" << endl; 
    char** b=getS(); 
    char c[][5] = {"one","two","thr"};


    //a.insert(a.begin(), b, b+3);

    for(i=0;i<3; i++)
    {
        a.push_back(b[i]);
    }


    for(i=0;i<3; i++) 
        free(b[i] );

    free(b); 

    for(i=0;i<3; i++)
    {
        cout <<a[i].c_str() << endl; 
    }
    return 0;
}

char** getS()
{
    char** list; 
    int number_of_row=3,number_of_col =5,i;
    list = (char**)malloc(sizeof(char*)*number_of_row);
    for(i=0;i<number_of_row; i++) 
    {
        list[i] =(char*) malloc(sizeof(char)*number_of_col);  
        list[i] ="Hello";
    }

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

我尝试在 …

c++ pointers vector

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